2

我从MSDN DLL 示例创建了 MathFuncsDll.dll并运行调用 .cpp 工作正常。现在,尝试在 IPython 中使用 ctypes 加载它

import ctypes
lib = ctypes.WinDLL('MathFuncsDll.dll')

在正确的文件夹中产生

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 28: ordinal not in range(128)

类似地,在 Python shell 中,这会产生

WindowsError: [Error 193] %1 is not a valid Win32 application

我应该改变什么?嗯,它可能是 Win 7 64 位与一些 32 位 dll 之类的,对吗?等我有空的时候再看看。

4

1 回答 1

3

ctypes不适用于编写 MathFuncsDLL 示例的 C++。

相反,用 C 编写,或者至少导出一个“C”接口:

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport) double Add(double a, double b)
{
    return a + b;
}

#ifdef __cplusplus
}
#endif

另请注意,调用约定默认为__cdecl,因此请使用CDLL而不是WinDLL(使用__stdcall调用约定):

>>> 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
于 2012-04-15T16:42:47.340 回答