Visual Studio C++ DLL库在Qt应用程序中崩溃

sch*_*dar 9 c++ dll qt abi visual-c++

我在MS Visual C++ DLL库和Qt程序之间共享"std :: string"数据时遇到问题.

我有的是:

在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库.

问题:

  • 是否使用Windows的Qt库(VS 2010)和Visual Studio工具链不足以克服ABI兼容性问题?
  • 这是否意味着我应该自己编译Qt框架?
  • 请帮忙 - 欢迎任何想法......

Rob*_*ert 0

名义上我不会冒险在应用程序和 DLL 之间传递复杂的数据(不受我的控制,按代码方式)。我只会使用传递 POD 结构,即我会将接口更改为此:

class CTest: public ITest
{
public:
    CTest();
    virtual ~CTest();
    virtual void getVersion(char* versionBuffer, unsigned length) const;
};
Run Code Online (Sandbox Code Playgroud)

让生活变得更轻松;)