2

我正在尝试从 Qt 中连接的 DLL 获取 std::string/std::wstring 返回值,但我遇到了问题。

来自 DLL 的代码:

using namespace std;
extern "C++" __declspec(dllexport) string test()
{
    return "Passed!";
}

我的 Qt 应用程序(Qt Creator)中的代码:

typedef std::string (*Test)();
QLibrary *lib = new QLibrary("dllname");
lib->load();
.... dll load check ....
Test test = (Test) lib->resolve("test");
std::string s = test();
QString name = QString::fromStdString(s);

结果“name”变量将“H”替换为“Passed!” 我做错了什么?

提前致谢

4

2 回答 2

1

感谢您的评论,我做到了:

extern "C" __declspec(dllexport) int test(wchar_t* out)
{
    wcscpy_s(out, MAX_PATH, L"Passed!"); // I'm using sys paths in my app, 
                                           // so MAX_PATH is ok for me
    return 0;
}

Qt方面:

typedef int (*Test)(wchar_t*);
QLibrary *lib = new QLibrary("dllname");
lib->load();
.... dll load check ....
Test test = (Test) lib->resolve("test");
wchar_t s[MAX_PATH];
test(s);
QString name = QString::fromWCharArray(s);

变量“名称”现在应该是“通过!”

在 QLibrary 类参考中只说支持

extern "C" __declspec(dllexport)

指示。

更新感谢@MSalters

于 2011-11-01T09:17:48.730 回答
0

问题是extern "C++"函数的名称被破坏了。这允许重载。extern "C"函数不能重载。

QLibrary不能处理重载,也不能处理名称修改。因此它需要extern "C"函数。但是,这些可能仍使用 C++ 类型。

如果失败,您将获得未定义的行为。你很倒霉,如果它会崩溃就更好了。

于 2011-11-01T15:37:04.647 回答