2011-10-31 152 views
2

我想要得到std :: string/std :: wstring从Qt中的连接DLL返回的值,我有这个问题。从DLLQt和VS C++ dll函数返回值

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

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

代码:

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); 

在结果 “名” 变量将有 “H” insted的的 “过去了!” 我做错了什么?

在此先感谢

+0

你是否动态链接到相同的运行时? –

+0

是的,链接在Qt Ctreator,在VS2010中编译的dll – Nek

+0

你的Qt应用程序也需要链接到MSVC运行时。哦,没有外部的“C++”。 –

回答

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

+0

我认为你错误的假设。你可以在extern“C”函数中使用'std :: string'。 – MSalters

+0

我被编译器错误弄糊涂了,我做了错误的假设。谢谢 :) – Nek

0

的问题是,extern "C++"功能有其名错位。这允许超载。 extern "C"函数不能重载。

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

如果您失败,您将收到未定义的行为。你不走运,如果它刚刚坠毁,情况会更好。