Python 32 位 on Windows 64 位 Ctypes 模块错误
Python 32bit on Windows 64bit Ctypes module error
在 python 3.4.3 和 2.7.9 中,当我尝试调用内核库中的任何函数时。
从 32 位版本的 python 到 64 位 windows,打印一条错误消息:
from ctypes import *
path=create_string_buffer(256)
rs=cdll.Kernel32.GetModuleFileNameA(0,path,256)
print (path)
错误如下:
Traceback (most recent call last):
File "test-ctypes.py", line 3, in <module>
ValueError: Procedure called with not enough arguments (12 bytes missing) or wrong calling convention
异常信息告诉你答案:
ValueError: 使用 参数不足 (缺少 12 个字节)或 错误的调用约定
调用的过程
参数个数正确,所以一定是另一个:你使用了错误的调用约定。调用约定是编译器将 C 中的三个参数映射为在调用函数时将实际值存储在内存中的方式(以及其他一些内容)。在 MSDN documentation for GetModuleFileA 上您会找到以下签名
DWORD WINAPI GetModuleFileName(
_In_opt_ HMODULE hModule,
_Out_ LPTSTR lpFilename,
_In_ DWORD nSize
);
WINAPI
告诉编译器使用 stdcall
调用约定。您的 ctypes 代码使用 cdll
,另一方面假定 cdecl
调用对流。解决方法很简单:把cdll
改成windll
:
from ctypes import *
path=create_string_buffer(256)
rs=windll.Kernel32.GetModuleFileNameA(0,path,256)
print (path)
与 ctypes documentation for accessing .dll's 比较,其中 kernel32
明确显示使用 windll
。
在 python 3.4.3 和 2.7.9 中,当我尝试调用内核库中的任何函数时。
从 32 位版本的 python 到 64 位 windows,打印一条错误消息:
from ctypes import *
path=create_string_buffer(256)
rs=cdll.Kernel32.GetModuleFileNameA(0,path,256)
print (path)
错误如下:
Traceback (most recent call last):
File "test-ctypes.py", line 3, in <module>
ValueError: Procedure called with not enough arguments (12 bytes missing) or wrong calling convention
异常信息告诉你答案:
ValueError: 使用 参数不足 (缺少 12 个字节)或 错误的调用约定
调用的过程参数个数正确,所以一定是另一个:你使用了错误的调用约定。调用约定是编译器将 C 中的三个参数映射为在调用函数时将实际值存储在内存中的方式(以及其他一些内容)。在 MSDN documentation for GetModuleFileA 上您会找到以下签名
DWORD WINAPI GetModuleFileName(
_In_opt_ HMODULE hModule,
_Out_ LPTSTR lpFilename,
_In_ DWORD nSize
);
WINAPI
告诉编译器使用 stdcall
调用约定。您的 ctypes 代码使用 cdll
,另一方面假定 cdecl
调用对流。解决方法很简单:把cdll
改成windll
:
from ctypes import *
path=create_string_buffer(256)
rs=windll.Kernel32.GetModuleFileNameA(0,path,256)
print (path)
与 ctypes documentation for accessing .dll's 比较,其中 kernel32
明确显示使用 windll
。