2011-05-27 42 views
3

我剛剛瞭解了dll的。我在Qt中試過。首先,我發佈了與dll相關的文件。Qt -Dll相關問題

首先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 

這一個是DLL - 源文件 「check.cpp」

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

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

我編譯了上面的工程文件,得到了dll。該dll的名稱是「dll.dll」

現在是主文件。在這裏我嘗試通過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 

然後你可以DLL_EXPORT更換__declspec(dllexport)在你的榜樣,並確保上面的代碼中任何導出的符號之前包括在內。

然後添加

DEFINES += USE_DLL BUILD_DLL 

到DLL的項目文件(當然是DLL建設,只有當!)和

DEFINES += USE_DLL 

使用DLL導出函數的任何項目。這很醜陋,但是習慣用法。

+0

你是說我必須把__declspec(dllexport)放在「check.h」中,當我用「main」文件編譯它時。 – prabhakaran 2011-05-27 14:28:21

+0

@prabhakaran:我在你的真實代碼中澄清了你需要用DLL魔術做什麼。 – rubenvb 2011-05-27 14:57:14

+0

我得到這個錯誤「invalid or corrupt file:can not read at 0x2C0」 – prabhakaran 2011-05-28 06:26:18