2011-05-27 3 views
3

Я просто узнаю о dll's. Я попробовал это в Qt. Сначала я отправляю файлы, связанные с dll.Qt - проблема, связанная с Dll

Первый длл - про файл

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 

Это одна длл - исходный файл "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. Я не знаю, какая часть ошибочна. Кто-нибудь, помогите мне?

ответ

6

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

// 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 экспортируемых функций. Это довольно уродливо, но идиоматично, и это работает.

+0

Вы говорите, что мне нужно поставить __declspec (dllexport) в «check.h», когда я скомпилирую это с «основным» файлом. – prabhakaran

+0

@prabhakaran: Я уточнил, что вам нужно сделать с магией DLL в вашем реальном коде. – rubenvb

+0

Я получаю эту ошибку «недействительный или поврежденный файл: не может читать на 0x2C0» – prabhakaran

Смежные вопросы