经过几个小时的搜索和尝试各种示例后,我问这个问题,但我似乎无法从加载的DLL中调用函数。我想如果有人能给我一个例子,我就能理解我做错了什么,并取得了一些进展。
首先,使用Python 3.3.3,我可以加载DLL,如下:
import ctypes
ftdi=ctypes.cdll.LoadLibrary('C:\\Python33\\DLLs\\FTCJTAG.dll')
我可以调用一个不需要任何参数的函数,并获得一个有意义的数字。但经过多次尝试,我无法弄清楚如何将参数传递给函数(即指针,字符串,数字)。
例如,来自FTCJTAG.h
,我们有:
FTCJTAG_API
FTC_STATUS WINAPI JTAG_GetDllVersion(LPSTR lpDllVersionBuffer, DWORD dwBufferSize);
从DLL程序员指南:
FTC_STATUS JTAG_GetDllVersion(LPSTR lpDllVersionBuffer, DWORD dwBufferSize)
This function returns the version of this DLL.
Parameters
lpDllVersionBuffer Pointer to the buffer that receives the version of this DLL.
The string will be NULL terminated.
dwBufferSize Length of the buffer created for the device name string. Set buffer
length to a minimum of 10 characters.
Return Value
Returns FTC_SUCCESS if successful, otherwise the return value will be one of the
following error codes:
FTC_NULL_DLL_VERSION_BUFFER_POINTER
FTC_DLL_VERSION_BUFFER_TOO_SMALL*
所以,我试试这个:
version_string = ctypes.c_char * 10
string_ptr=version_string()
ftdi.JTAG_GetDllVersion(string_ptr,ctypes.c_long(10))
我得到了回复:
Traceback (most recent call last):
File "C:\Python33\Scripts\FTDI.py", line 5, in <module>
ftdi.JTAG_GetDllVersion(string_ptr,ctypes.c_long(10))
ValueError: Procedure called with not enough arguments (8 bytes missing) or wrong
calling convention
我已经厌倦了许多不同的方法来传递指向函数的指针或字符串的长度,但仍然没有成功。
有人可以提供一个如何将这些参数传递给此函数的示例吗?我相信一旦看到一个有效的例子,我就可以弄清楚如何调用这个DLL中的其余函数。
谢谢你的时间!
编辑:
@ Daniel:感谢您使用'windll'代替'cdll'的建议,因为现在上面的函数调用执行时没有错误。但是,如果我尝试调用另一个函数,我会得到一个不同的错误(还有一个我也经常搜索并且难以解决的错误):
FTC_STATUS WINAPI JTAG_GetNumDevices(LPDWORD lpdwNumDevices);
要调用此函数,我这样做:
x = ctypes.c_ulong
x_ptr = x()
ftdi.JTAG_GetNumDevices(x_ptr)
错误是这样的:
Traceback (most recent call last):
File "C:\Python33\Scripts\FTDI.py", line 9, in <module>
ftdi.JTAG_GetNumDevices(x_ptr)
OSError: exception: access violation writing 0x00000000
我收集的是我没有将指针的正确地址传递给该函数,但是经过多次搜索后,我没有找到答案。我确信这是简单的事情。 。 。 :)
再次感谢您的时间!