Windows 64位Ctypes模块上的Python 32位错误

时间:2015-05-20 07:32:48

标签: python-2.7 python-3.x ctypes windows64

当我尝试从内核库调用任何函数时,在python 3.4.3和2.7.9中都有

在64位窗口上从32位版本的python中打印出一条错误消息:

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

1 个答案:

答案 0 :(得分:4)

异常消息告诉您答案:

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