Python ctypes和包装c ++ std:wstring

时间:2014-08-26 21:44:31

标签: python c++ ctypes

我正在使用msvc ++和Python 2.7。我有一个返回std:wstring的dll。我试图以这样的方式包装它,它通过ctypes从Python作为c样式字符串公开。我显然不明白两者之间如何处理字符串。我把它简化为一个简单的例子来理解传递机制。这就是我所拥有的:

C ++

#include <iostream>

class WideStringClass{
    public:
        const wchar_t * testString;
};


extern "C" __declspec(dllexport) WideStringClass* WideStringTest()
{ 
    std::wstring testString = L"testString";
    WideStringClass* f = new WideStringClass();
    f->testString = testString.c_str();
    return f; 
}

的Python:

from ctypes import *

lib = cdll.LoadLibrary('./myTest.dll')

class WideStringTestResult(Structure):
    _fields_ = [ ("testString", c_wchar_p)]

lib.WideStringTest.restype = POINTER(WideStringTestResult)
wst = lib.WideStringTest()
print wst.contents.testString

而且,输出:

????????????????????᐀㻔

我错过了什么?

修改 将C ++更改为以下内容可以解决问题。当然,我想我现在有内存泄漏。但是,这可以解决。

#include <iostream>

class WideStringClass{
    public:
        std::wstring testString;
        void setTestString()
        {
            this->testString = L"testString";
        }
};


class Wide_t_StringClass{
    public:
        const wchar_t * testString;
};

extern "C" __declspec(dllexport) Wide_t_StringClass* WideStringTest()
{ 
    Wide_t_StringClass* wtsc = new Wide_t_StringClass();
    WideStringClass* wsc = new WideStringClass();
    wsc->setTestString();
    wtsc->testString = wsc->testString.c_str();

    return wtsc; 
}

感谢。

1 个答案:

答案 0 :(得分:1)

有一个与Python无关的重大问题:

f->testString = testString.c_str();

这是不正确的,因为testString(您声明的std::wstring)是一个局部变量,一旦该函数返回,testString就会消失,从而使任何尝试无效使用c_str()返回的内容。

那你怎么解决这个问题呢?我不是Python程序员,但字符数据通常在两种不同语言之间编组的方式是将字符复制到接收方或发送方创建的缓冲区(前者比后者更好)。