Articles of ctypes

Python的ctypes从Linux上的libc调用reboot()

我试图通过ctypes从Python中的libc调用rebootfunction,我只是不能得到它的工作。 我一直在引用man 2 reboot页面( http://linux.die.net/man/2/reboot )。 我的内核版本是2.6.35。 下面是来自交互式Python提示符的控制台日志,我试图让我的机器重启 – 我做错了什么? 为什么不是ctypes.get_errno()工作? >>> from ctypes import CDLL, get_errno >>> libc = CDLL('libc.so.6') >>> libc.reboot(0xfee1dead, 537993216, 0x1234567, 0) -1 >>> get_errno() 0 >>> libc.reboot(0xfee1dead, 537993216, 0x1234567) -1 >>> get_errno() 0 >>> from ctypes import c_uint32 >>> libc.reboot(c_uint32(0xfee1dead), c_uint32(672274793), c_uint32(0x1234567), c_uint32(0)) -1 >>> get_errno() 0 >>> libc.reboot(c_uint32(0xfee1dead), c_uint32(672274793), […]

Python的ctypes不加载在Mac OS X的dynamic库

我有一个C ++库repeater.so ,我可以在Linux中从Python加载以下方式: import numpy as np repeater = np.ctypeslib.load_library('librepeater.so', '.') 但是,当我在Mac OS X(Snow Leopard,32位)上编译相同的库并获得repeater.dylib ,然后在Python中运行以下代码: import numpy as np repeater = np.ctypeslib.load_library('librepeater.dylib', '.') 我得到以下错误: OSError: dlopen(/mydir/librepeater.dylib, 6): no suitable image found. Did find: /mydir/librepeater.dylib: mach-o, but wrong architecture 在Mac OS X上,我是否需要做一些不同的工作才能在Python中加载dynamic库?

python ctypes和sysctl

我有以下代码 import sys from ctypes import * from ctypes.util import find_library libc = cdll.LoadLibrary(find_library("c")) CTL_KERN = 1 KERN_SHMMAX = 34 sysctl_names = { 'memory_shared_buffers' : (CTL_KERN, KERN_SHMMAX), } def posix_sysctl_long(name): _mem = c_uint64(0) _arr = c_int * 2 _name = _arr() _name[0] = c_int(sysctl_names[name][0]) _name[1] = c_int(sysctl_names[name][1]) result = libc.sysctl(_name, byref(_mem), c_size_t(sizeof(_mem)), None, c_size_t(0)) if […]

ctypes加载具有依赖关系的ac共享库

在Linux上,我有一个交stream共享库,依赖于其他库。 LD_LIBRARY_PATH已正确设置为允许链接器加载所有库。 当我做: libgidcwf = ctypes.cdll.LoadLibrary(libidcwf_path) 我得到以下错误: Traceback (most recent call last): File "libwfm_test.py", line 12, in <module> libgidcwf = ctypes.cdll.LoadLibrary(libidcwf_path) File "/usr/lib/python2.5/ctypes/__init__.py", line 431, in LoadLibrary return self._dlltype(name) File "/usr/lib/python2.5/ctypes/__init__.py", line 348, in __init__ self._handle = _dlopen(self._name, mode) OSError: path-to-my-lib/libwav.so: undefined symbol: ODBCGeneralQuery 看来LD_LIBRARY_PATH在这里没有效果。 有没有办法让这些依赖库“可载入”? 先谢谢您的帮助。

当调用gcc编译的dll返回一个结构时,ctypes cdecl给出了4个字节

我有ac库(花栗鼠),我想打电话使用ctypes。 但是,它返回一个结构的函数失败? 我得到的错误是 File "qw.py", line 19, in <module> b = cpBBNew3(1,2,3,4) ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong calling convention 这是(相关的)c代码:在cpBB.h中 typedef struct cpBB { cpFloat l, b, r ,t; } cpBB; cpBB cpBBNew3(cpFloat l, cpFloat b, cpFloat r, cpFloat t); 在cpBB.c cpBB cpBBNew3(cpFloat l, cpFloat b, cpFloat r, […]

Python – 如何获得一个进程的开始/基地址?

我如何获得进程的开始/基地址? 每个示例Solitaire.exe(solitaire.exe + BAFA8) #-*- coding: utf-8 -*- import ctypes, win32ui, win32process PROCESS_ALL_ACCESS = 0x1F0FFF HWND = win32ui.FindWindow(None,u"Solitär").GetSafeHwnd() PID = win32process.GetWindowThreadProcessId(HWND)[1] PROCESS = ctypes.windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS,False,PID) print PID, HWND,PROCESS 我想计算一个内存地址,为此我需要solitaire.exe的基地址。 这里是我的意思的图片:

检查一个任意的用户是否在使用Python的pipe理员组中

有没有办法来检查是否有任何用户在pipe理员组? 我知道如何检查当前用户是否是pipe理员使用: import ctypes print ctypes.windll.shell32.IsUserAnAdmin() 但是,如果我以userAlogin,我想知道userZed是否具有pipe理员权限。 任何指针或build议将有所帮助,似乎我无法追查ctypes.windll.shell32上的任何文档。

在Python中接收WM_COPYDATA

我试图从Python读取WM_COPYDATA消息一些应用程序(我试图与Spotify)发送到WindowsLiveMessenger更新“我在听什么…”的短语。 从我所能find的, WM_COPYDATA消息进来COPYDATASTRUCT具有以下结构: 在我们的情况下,dwData 0x547,以便它访问现在正在侦听function cbData与接收的string的长度 带有指向string本身的指针的lpData可能包含Unicode字符 该string应具有以下格式: \0Music\0status\0format\0song\0artist\0album\0由ListeningNowTracker 我们在WM_COPYDATA事件中收到的是一个包含COPYDATASTRUCT lParam指针。 我开始修改pywin32函数,我记得他们不接受过去经验的Unicode字符,然后我切换到ctypes。 尽pipe这对Python来说已经是一个新的世界了,但我用POINTER()试了一下,所有的东西都是未知对象,或者是访问违规。 我认为代码应该创build一个COPYDATASTRUCT : class CopyDataStruct(Structure): _fields_ = [('dwData', c_int), ('cbData', c_int), ('lpData', c_void_p)] 然后使lParam成为指向该结构的指针,从ctypes.string_at(lpData,cbData)获取string指针,最后用ctypes.string_at(lpData,cbData)获取string。 有小费吗? 更新1 为了这个目的, WM_COPYDATA事件被一个用win32gui构build的隐藏窗口接收。 copydata事件连接到一个名为OnCopyData的函数,这是它的头部: def OnCopyData(self, hwnd, msg, wparam, lparam): 与Spy ++消息日志相比,函数提供的值是正确的。 更新2 这应该是接近我想要的,但给出一个空指针错误。 class CopyDataStruct(ctypes.Structure): _fields_ = [('dwData', c_int), ('cbData', c_int), ('lpData', c_wchar_p)] PCOPYDATASTRUCT = ctypes.POINTER(CopyDataStruct) pCDS […]

在系统中为用户更换Python中的壁纸

我想要做的是在Windows中更改桌面壁纸。 要做到这一点,我使用下面的代码: import ctypes import Image pathToBmp = "PATH TO BMP FILE" SPI_SETDESKWALLPAPER = 20 ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, pathToBmp , 0) 这个工程当我运行.py文件时,这工作时,我使用py2exe转换它,并在当前用户下运行该exe文件,但是当我作为SYSTEM运行该exe文件时,当前用户背景不会更改。 这当然是可以预料的。 但我不知道如何解决。 顺便说一下,如果您的任何解决scheme更改当前用户背景或所有用户的背景,则无关紧要。 感谢您的时间。

Python的ctypes和没有足够的参数(4字节丢失)

我试图调用的函数是: void FormatError (HRESULT hrError,PCHAR pszText); 从一个自定义的DLL使用windll。 c_p = c_char_p() windll.thedll.FormatError(errcode, c_p) 结果是: ValueError: Procedure probably called with not enough arguments (4 bytes missing) 使用cdll而不是增加字节丢失计数器12.上面的errcode是从另一个函数返回的同一个dll的errercode。 我如何接听电话?