sch*_*dar 9 c++ dll qt abi visual-c++
我在MS Visual C++ DLL库和Qt程序之间共享"std :: string"数据时遇到问题.
用Visual C++ 2010 Express编写的DLL库,它导出一个方法:
extern "C" __declspec(dllexport) int Init(ITest* commandTest);
Run Code Online (Sandbox Code Playgroud)抽象界面"ITest"和实现它的类:
class CTest: public ITest
{
public:
CTest();
virtual ~CTest();
virtual void getVersion(std::string & version) const;
};
Run Code Online (Sandbox Code Playgroud)Qt GUI应用程序需要:
* load the DLL dynamically
* instantiate CTest and pass it to exported Init method.
Run Code Online (Sandbox Code Playgroud)在DLL的"Init"中,调用"CTest :: getVersion()"方法.我希望它会填充"&version"字符串.当我用新字符串填充"&version"时,我得到的是崩溃.
从http://qt-project.org/downloads下载了"Qt libraries 4.8.3 for Windows(VS 2010,235 MB)" ,安装它并在QtCreator的项目设置中选择它.
在QtCreator中从MinGW工具链切换到使用MS Visual Studio 2010 Express安装的工具链.
我认为它将克服这个问题,因为我使用了VS 2010编译的Qt库,Qt GUI也用VS C++工具链编译.不幸的是问题没有消失,所以我尝试了最后一步:
在Visual Studio中创建Win32控制台应用程序,通过LoadLibrary加载我的DLL,使用"Init"方法,就像我在Qt GUI中一样...并且它工作!
在"CTest :: getVersion()"中,我打印通过引用传递给控制台的"版本"字符串.使用VS C++控制台应用程序作为主机时,它将正确打印出来.当使用Qt应用程序时 - "版本"字符串打印出一些垃圾(例如┌►☻qwerty27)
这让我觉得Qt app和我的DLL的ABI仍然不兼容,即使使用上面提到的Qt VS 2010库.
名义上我不会冒险在应用程序和 DLL 之间传递复杂的数据(不受我的控制,按代码方式)。我只会使用传递 POD 结构,即我会将接口更改为此:
class CTest: public ITest
{
public:
CTest();
virtual ~CTest();
virtual void getVersion(char* versionBuffer, unsigned length) const;
};
Run Code Online (Sandbox Code Playgroud)
让生活变得更轻松;)