我正试图从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);
result "name"变量将用"H"代替"Passed!"我做错了什么?
Thanks in advance
谢谢你的评论,我已经做到了:
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);
变量"name"现在应该是"Passed!"
在QLibrary类引用中说只支持
extern "C" __declspec(dllexport)
指令。
谢谢@MSalters
问题是extern "C++"
函数的名称被曲解了。这允许重载。extern "C"
函数不能重载
QLibrary
不能处理重载,也不能处理名称混淆。因此需要extern "C"
函数。然而,这些可以仍然使用c++类型。
如果失败,您将获得未定义行为。你很不幸,如果它直接坠毁就好了。