windll ctypes вызывает функцию variadic c из python 2.7, работает в win64, но не в win32 - PullRequest
0 голосов
/ 17 мая 2018

Я использую Python 2.7 в Windows 10-32 и Windows 10-64.

Я пишу оболочку Python для DLL-библиотеки, скомпилированной на C (stdcall) (= mydll). У меня есть 2 версии DLL - 32 и 64 бит. Версия 64 прекрасно работает, используя windll.mydll. Версия 32 прекрасно работает, используя одну и ту же команду для всех функций в DLL, за исключением переменных printf -подобных функций.

При работе mydll.myvarfunc("Hello")

я получаю ValueError: Procedure probably called with too many arguments (4 bytes in excess)

Есть ли способ обойти это, не включая изменение кода C для функций с переменными числами?

1 Ответ

0 голосов
/ 18 мая 2018

На Win64 есть только один ABI, поэтому WinDLL и CDLL не имеют значения.В Win32 функции variadic всегда __cdecl, поэтому WinDLL использует неправильное соглашение о вызовах.

Один из способов обойти это:

import ctypes
stdcall_func = ctypes.WinDLL('mydll').stdcall_func
cdecl_func = ctypes.CDLL('mydll').cdecl_func
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...