2011-05-27 23 views
3

私はdllについて学んでいます。私はQtでそれを試しました。まず、dll関連のファイルを投稿しています。Qt - Dll関連の問題

第1DLL - プロファイル

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 

この1つはDLLである - ソースファイル "check.cpp"

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

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

上記のプロジェクトファイルをコンパイルし、dllを取得しました。 DLLの名前は "dll.dll"

今すぐメインファイルが来ます。ここでは、DLLを使って "check"関数にアクセスしようとしました。

#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)を交換し、上記のコードは、任意のエクスポートされたシンボルの前に含まれていることを確認してください。 DLLエクスポート関数を使用して、任意のプロジェクトに

あなたはその後、(当然のDLLとして構築した場合にのみ!)DLLのプロジェクトファイルに

DEFINES += USE_DLL BUILD_DLL 

を追加し、

DEFINES += USE_DLL 

。それはかなり醜いですが、慣用であり、それは動作します。

+0

"main"ファイルでコンパイルすると、 "check.h"に__declspec(dllexport)を入れなければならないと言っていますか? – prabhakaran

+0

@prabhakaran:私はあなたの実際のコードでDLLの魔法を使う必要があることを明確にしました。 – rubenvb

+0

このエラーが「無効または破損したファイル:0x2C0で読み取れません」 – prabhakaran