Python 32bit на Windows 64bit Ctypes модуль ошибка

В обоих Python 3.4.3 и 2.7.9, когда я пытаюсь вызвать любую функцию из библиотеки ядра.

из 32-битной версии python на 64-битных окнах выводится сообщение об ошибке:

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 ответ

Решение

Сообщение об исключении говорит вам ответ:

ValueError: Процедура вызвана с недостаточным количеством аргументов (не хватает 12 байт) или неверное соглашение о вызовах

Количество аргументов правильное, поэтому оно должно быть другим: вы используете неправильное соглашение о вызовах. Соглашение о вызовах - это способ, которым компилятор отображает три аргумента в C таким образом, чтобы сохранять действительные значения в памяти при вызове функции (среди прочего). В документации MSDN для 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 для доступа к.dll, где kernel32 явно показано, чтобы использовать windll,

Другие вопросы по тегам