Функция dll Qt и VS C ++, возвращающая значение - PullRequest
2 голосов
/ 01 ноября 2011

Я пытаюсь получить возвращенное значение std :: string / std :: wstring из подключенной DLL в Qt, и у меня возникла проблема с этим.

код из 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!" Что я делаю не так?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Спасибо за ваши комментарии, я сделал это:

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

0 голосов
/ 01 ноября 2011

Проблема в том, что у extern "C++" функций искажено название. Это позволяет перегружать. extern "C" функции не могут быть перегружены.

QLibrary не может иметь дело ни с перегрузкой, ни с искажением имени. Поэтому ему нужно extern "C" функций. Однако эти могут по-прежнему использовать типы C ++.

Если вы потерпите неудачу, вы получите неопределенное поведение. Тебе не повезло, было бы лучше, если бы он просто разбился.

...