windows - windll ctypes kalder variadic c funktion fra python 2.7 fungerer i win64 men ikke i win32

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger Python 2.7 på Windows 10-32 og Windows 10-64.


Jeg skriver en python wrapper til en C compiled stdcall (Windows) DLL (= mydll) .Jeg har 2 versioner af DLL - 32 og 64 bit.
64-versionen fungerer godt ved hjælp af windll.mydll.
32-versionen fungerer godt ved at bruge samme kommando til alle funktioner på DLL'en, undtagen variadiske printf -lignende funktioner.


Når du kører mydll.myvarfunc("Hello")


Jeg får
ValueError: Procedure probably called with too many arguments (4 bytes in excess)


Er der en vej rundt om dette, der ikke indebærer at ændre C-koden til de variadiske funktioner?

Bedste reference


På Win64 er der kun én ABI, så WinDLL og CDLL gør ingen forskel. På Win32 er variadiske funktioner altid \_\_cdecl, så WinDLL bruger den forkerte kaldkonvention.


En måde at arbejde rundt på dette:


import ctypes
stdcall\_func = ctypes.WinDLL('mydll').stdcall\_func
cdecl\_func = ctypes.CDLL('mydll').cdecl\_func