Python Ctypes读取从C ++ dll

时间:2018-02-13 13:40:15

标签: python c++ ctypes

我发现了ctypes的世界,因为我在Windows上用C ++编写了一个带有C包装器的DLL,以便能够在Python上使用它。当我从C ++函数返回一个char *,如何在指针的地址获取数据时,我不明白它如何在Python上使用指针?

myClass.h档案:

#include "myClassInc.h"
class __declspec(dllexport) myClass// __declspec to generate .lib file
{
public:
    // Attributes
    char * name;

    // Methods
    myClass();
    ~myClass();

    bool myMethod(string);
};

myClassInc.h(C包装):

#ifdef MYCLASS
#  define EXPORT __declspec(dllexport)
#else
#  define EXPORT __declspec(dllimport)
#endif

// Wrapper in C for others languages (LabVIEW, Python, C#, ...)
extern "C"
{
    EXPORT typedef struct myClass myClass; // make the class opaque to the wrapper
    EXPORT myClass* cCreateObject(void);
    EXPORT char* cMyMethod(myClass* pMyClass);
}

myClass.cpp

#include "myClass.h"

myClass::myClass() {}
myClass::~myClass() {}

bool myClass::myMethod(string filename_video)
{
    int iLength = filename_video.length();
    name = new char[iLength+1];
    strcpy(name, filename_video.c_str());
    return true;
}

myClass* cCreateObject(void)
{
    return new myClass();
}

char * cMyMethod(myClass* pMyClass)
{
    if (pMyClass->myMethod("hello world"))
        return pMyClass->name;
}

最后pythonScript.py

from ctypes import *

mydll = cdll.LoadLibrary("mydll.dll")
class mydllClass(object):
    def __init__(self):
        mydll.cCreateObject.argtypes = [c_void_p]
        mydll.cCreateObject.restype = c_void_p

        mydll.cMyMethod.argtypes = [c_void_p]
        mydll.cMyMethod.restype = POINTER(c_char_p)

        self.obj = mydll.cCreateObject("")

    def myMethod(self):
        return mydll.cMyMethod(self.obj)

f = mydllClass() # Create object
a = f.myMethod() # WANT HERE TO READ "HELLO WORLD"

a中的结果为<__main__.LP_c_char_p object at 0x0000000002A4A4C8>

我没有在ctypes文档中找到如何读取这样的指针数据。你能帮帮我吗?

如果我想从Python传递char *到myDll,那么将会出现同样的问题,如何做到这一点(通常是在dll中给出从Python读取的文件的路径)。

1 个答案:

答案 0 :(得分:1)

c_char_pchar*POINTER(c_char_p)char**。修复你的.restype,你应该做得很好。 ctypes具有将c_char_p转换为Python字节字符串的默认行为。

此外,mydll.cCreateObject.argtypes = None对于没有参数是正确的。现有定义指出void*是必需参数。