问题
I created the MathFuncsDll.dll from MSDN DLL example and running the calling .cpp worked fine. Now, trying to load this in IPython with ctypes like
import ctypes
lib = ctypes.WinDLL('MathFuncsDll.dll')
being in the correct folder yields
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 28: ordinal not in range(128)
Similarly in Python shell this yields
WindowsError: [Error 193] %1 is not a valid Win32 application
What should I change? Hm, it might be Win 7 64bit vs. some 32bit dll or something right? I'll check later when I've time again.
回答1:
ctypes
doesn't work with C++, which the MathFuncsDLL example is written in.
Instead, write in C, or at least export a "C" interface:
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) double Add(double a, double b)
{
return a + b;
}
#ifdef __cplusplus
}
#endif
Also note that the calling convention defaults to __cdecl
, so use CDLL
instead of WinDLL
(which uses __stdcall
calling convention):
>>> import ctypes
>>> dll=ctypes.CDLL('server')
>>> dll.Add.restype = ctypes.c_double
>>> dll.Add.argtypes = [ctypes.c_double,ctypes.c_double]
>>> dll.Add(1.5,2.7)
4.2
来源:https://stackoverflow.com/questions/10163832/python-simple-ctypes-dll-load-yields-error