Qt - Dll связанная проблема - PullRequest
3 голосов
/ 27 мая 2011

Я только что узнал о DLL.Я попробовал это в Qt.Сначала я публикую файлы, связанные с dll.

Первый файл dll - pro

TEMPLATE = lib

SOURCES += \
    check.cpp

HEADERS += \
    check.h

Это файл заголовка dll "check.h"

#ifndef CHECK_H
#define CHECK_H

#include <iostream>

extern "C++" __declspec(dllexport) std::string check();

#endif // CHECK_H

Это dll - исходный файл "check.cpp"

#include <iostream>
#include "check.h"

extern "C++" __declspec(dllexport) std::string check()
{
    return "dll applied";
}

Я скомпилировал вышеуказанный файл проекта и получил dll.Имя dll - «dll.dll»

Теперь идет основной файл.Здесь я попытался получить доступ к функции «check» через dll.

#include "check.h"
#include <iostream>
#include "MyMessageBox.h"
#include <QApplication>
#include <QLibrary>
#include <QMessageBox>

typedef std::string (*CheckType) (void);

class MyMessageBox:public QMessageBox
{
public:
    MyMessageBox(std::string message,QWidget*parent=0):
       QMessageBox(QMessageBox::NoIcon,QString("ErrorMessage"),QString(message.c_str()),QMessageBox::Ok,parent,Qt::Widget)
    {
    }
};

int main(int argc,char * argv[])
{
    QApplication app(argc,argv);
    CheckType myCheck;
    QLibrary myLib("dll");
    myLib.load();

    bool ok = myLib.load();
    if(ok)
    {
        MyMessageBox mm("Load is done");
        mm.exec();
    }
    ok = myLib.isLoaded();
    if(ok)
    {
        MyMessageBox mm("Loaded");
        mm.exec();
    }
    myCheck = (CheckType) (myLib.resolve("check"));
    if(!myCheck)
    {
        MyMessageBox m0("Resolving isn't happened");
        m0.exec();
    }
    std::string result = myCheck();

    MyMessageBox mm(result);
    mm.exec();
    return app.exec();
}

Но когда я запустил вышеупомянутое приложение, я получил «Решение не произошло».Это означает, что указатель на функцию стал NULL.Я не знаю, какая часть не так.Кто-нибудь мне поможет?

1 Ответ

6 голосов
/ 27 мая 2011

Вам понадобится __declspec (dllimport) при компиляции программы с использованием DLL.Общий подход таков:

// Windows DLL magic
#if defined(USE_DLL)
# if defined(BUILD_DLL)
#  define DLL_EXPORT  __declspec(dllexport)
# else // BUILD_DLL
#  define DLL_EXPORT  __declspec(dllimport)
# endif // BUILD_DLL
#else // USE_DLL
# define DLL_EXPORT
#endif // USE_DLL

Затем вы заменяете __declspec(dllexport) в вашем примере на DLL_EXPORT, и убедитесь, что приведенный выше код включен перед любым экспортируемым символом.Затем вы добавляете

DEFINES += USE_DLL BUILD_DLL

в файл проекта dll (конечно, только при сборке как dll!) И

DEFINES += USE_DLL

в любой проект с использованием экспортируемых функций dll.Это довольно некрасиво, но идиоматично и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...