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
,