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クラスを提供する.次に、完全な例を示します.
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”})
次に、暗黙的に呼び出されたインスタンスコードを示します.
やはり暗黙的に呼び出すのが便利ですね.dllの関数を直接呼び出すことができます.
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の関数を直接呼び出すことができます.