如何从动态库通过ctypes到python </string>获取列表<string> *

时间:2014-10-04 20:10:45

标签: python ctypes

我有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)

0 个答案:

没有答案