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」変数は「Passed!」の代わりに「H」を持ちます。私が間違っているのは何ですか?

前もって感謝します

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

変数「name」は「Passed!」になります。

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 に答える