我有dll和一些描述。我从这个dll调用方法,并传递或检索信息。 到目前为止一切都很好,但我遇到了一个方法,它给出了列表*,我不知道如何检索这种格式。 以下是对它的描述: 方法GetTemplateList需要两个用于编写的参数:templateList(Type:list *)和templateCount(Type:int *)。
C ++用法示例:
typedef int (__stdcall *GetTemplateList)(list<tstring> *, int *);
GetTemplateList _GetTemplateList;
_GetTemplateList = (GetTemplateList) GetProcAddress(my_dll, "GetTemplateList");
list<string> templates;
int templCnt;
_GetTemplateList(&templates, &templCnt);
我的Python代码:
class List(Structure):
_fields_ = ("values", ctypes.c_char * 100)
class DllApi:
...
m_pHandle - load library # works 100%
m_iLastResultCode - getting result code from dll # works 100%
...
def GetTemplateList(self):
iTemplateCount = ctypes.c_int()
templateList = List()
pGetTemplateList = self.m_pHandle.GetTemplateList # works 100%
self.m_iLastResultCode = pGetTemplateList(templateList, ctypes.byref(iTemplateCount))
通过这样做,我收到了这个错误:
ValueError: Procedure probably called with too many arguments (96 bytes in excess)
如果我这样做,只需更改此字符串:
_fields_ = ("values", ctypes.c_char)
我明白了:
AIP error: there are null pointers in function parameters;
如果我不使用List类并使用缓冲区:
templateList = ctypes.c_buffer(100)
我明白了:
WindowsError: exception: access violation reading 0x00000000 (it takes value instead of address)