Qt呼び出しdllでの機能関数

3166 ワード

声明:事前に私はすでに自分で簡単なdllファイル(myDLL.dll)、C版インタフェースを書きました.そして、私の前の2つのDLLに関する文章の中の方法で、dllからインポートライブラリ(.lib)ファイルをエクスポートしました.dllには2つの関数があります.プロトタイプは以下の通りです.
   
void
 HelloWorld();    
//関数内部呼び出しWin 32 API、機能は1つのhelloworldヒントボックスを弾き出す
   
int
 add(
int
 a,
int
 b);  
//2つの数を加算して結果を返す
以下では、呼び出しと暗黙的呼び出しの2つの方法をそれぞれ表示することにより、Qtが外部dllファイルの機能関数をどのように呼び出すかをシミュレートする.
 
予備知識:
1.ライブラリファイル(.lib)をインポートせず、ヘッダファイル(.h)とダイナミックリンクライブラリ(.dll)のみの場合、呼び出しを表示する必要があります.この3つのファイルがすべて揃っていれば、簡単で便利な暗黙的な呼び出しを使用できます.
2、通常Windows下でdll呼び出しを表示する手順は、LoadLibrary()、GetProcAdress()、FreeLibrary()の3段階に分けられます.
ここで、LoadLibrary()関数は、指定したdllファイルを読み込み、呼び出しプログラムのメモリにロードするために使用されます(DLLには独自のメモリはありません!)
GetProcAddress()関数は、呼び出しのために指定されたダイナミックリンクライブラリ(DLL)の出力ライブラリ関数アドレスを取得します.
FreeLibrary()はdllが占める空間を解放する
 
1、呼び出しを表示
Qtは、呼び出しを表示するためのQLibraryクラスを提供する.次に、完全な例を示します.
 #include <QApplication>
 2 #include <QLibrary>
 3 #include <QDebug>
 4 #include <QMessageBox>
 5 #include "dll.h"             //     
 6 typedef int (*Fun)(int,int); //      ,    
 7 int main(int argc,char **argv)
 8 {
 9     QApplication app(argc,argv);
10     QLibrary mylib("myDLL.dll");   //      dll  
11     int result;
12     if (mylib.load())              //        
13     {
14         QMessageBox::information(NULL,"OK","DLL load is OK!");
15         Fun open=(Fun)mylib.resolve("add");    //   add()   
16         if (open)                  //        add()   
17         {
18             QMessageBox::information(NULL,"OK","Link to Function is OK!");
19             result=open(5,6);      //        dll   add()   
20             qDebug()<<result;
21         }
22         else
23             QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");
24     }
25     else
26         QMessageBox::information(NULL,"NO","DLL is not loaded!");
27         return 0;  //       

 myDLL.dllはカスタムdllファイルで、プログラムの出力ディレクトリにコピーして呼び出すことができます.明らかに、呼び出しコードの書き込み量が大きく、本当に不便であることを示しています.
 
2、暗黙呼び出し
この場合、ヘッダファイル(.h)、インポートライブラリファイル(.lib)、ダイナミックリンクライブラリ(.dll)の3つのファイルが必要です.具体的な手順は次のとおりです.
1、まず.h与.lib/.aファイルをプログラムの現在のディレクトリにコピーし、dllファイルをプログラムの出力ディレクトリにコピーします.
2、次はproファイルに追加します.libファイルの場所:LIBS+=-LD:/hitempt/api/-l myDLL
-Lパラメータの指定lib/.aファイルの場所
-lパラメータインポートライブラリファイル名を指定します(拡張子を付けないでください)
また、ライブラリファイルをインポートするパスでは、反スラッシュは右に傾ける
3、プログラムの中でincludeヘッダファイル(私の試験用のdllはCで書いたので、extern“C”{#include“dll.h”})
次に、暗黙的に呼び出されたインスタンスコードを示します.
 #include <QApplication>
 2 #include <QDebug>
 3 extern "C"    //   C  dll  , C++         extern "C" {},  
 4 {
 5         #include "dll.h"
 6 }
 7 int main(int argv ,char **argv)
 8 {
 9        QApplication app(argv,argv);
10        HelloWordl();          //  Win32 API   helloworld   
11        qDebug()<<add(5,6);    // dll             
12        return 0;  //     ,    ,         
13 }

やはり暗黙的に呼び出すのが便利ですね.dllの関数を直接呼び出すことができます.