Qt6 は、Windows で vc によって生成されたダイナミック リンク ライブラリ DLL を呼び出します。

Qt はクロスプラットフォーム ツールであり、明らかに Windows 動的ライブラリで動作します。

Windows オペレーティング システムでは、ライブラリはファイルの形式で存在し、ダイナミック リンク ライブラリ (DLL) とスタティック リンク ライブラリの 2 つのタイプに分類できます。ダイナミック リンク ライブラリのファイル コントロールのサフィックス名は .dll で、スタティック リンク ライブラリのファイル コントロールのサフィックス名は .lib です。ダイナミック リンク ライブラリでもスタティック リンク ライブラリでも、呼び出し元に変数、関数、またはパラメーターを提供します。

基本的に、Windows システム ライブラリは主に DLL ダイナミック ライブラリに基づいているため、C:\Windows\System32 の下には dll で終わるライブラリ ファイルが多数存在します。

⚠️ウィンドウの下にある理論的概念は、新人が理解するのにより適しており、上司はそれをバイパスする必要があります。

 1. ダイナミック リンク ライブラリについて簡単に説明します

ダイナミック リンク ライブラリのソース コードは、関数またはクラスの特定の実装です。ソース コードがコンパイルされると、拡張子 dll が付いたファイルが生成されます。このファイルは、バイナリ ファイルであるダイナミック リンク ライブラリ ファイルです。独立して実行することはできませんが、呼び出し元と組み合わせて実行する必要があります。通常、呼び出し元に変数、関数、またはクラスを提供できます。

1. 呼び出し元 (またはユーザー) は、アプリケーション プログラム (exe プログラム) または他のダイナミック リンク ライブラリです。

2. 呼び出し元に提供される関数は通常、エクスポート関数と呼ばれます。

3. 呼び出し元に提供されるクラスは、通常、エクスポートされたクラスと呼ばれます。

ダイナミック リンク ライブラリがコンパイルされると、.lib ファイル コントロールと .dll ファイルが生成されます。ここでの .lib ファイルは、スタティック リンク ライブラリ ファイルではなく、インポート ライブラリ ファイルを指します。サフィックス名は同じですが、スタティック リンク ライブラリ ファイル コントロールとして、この 2 つは関係がありません。

通話に関しては、次の 2 つの違いがあります。

暗黙的リンク:プログラムが実行されると、DLL ファイルがアプリケーションにロードされます。

明示的リンク:アプリケーションは実行中にいつでも DLL ファイルを追加でき、また、いつでも DLL ファイルをアンインストールできますが、これは暗黙的リンクでは実行できないため、表示リンクは柔軟性が高く、説明文に適しています。

.lib インポート ライブラリ ファイルには、エクスポートされた関数の名前とアドレスが DLL ドキュメント コントロールに保存されます。アプリケーション プログラムが暗黙的リンク ダイナミック リンク ライブラリを使用する場合、ライブラリ ドキュメント コントロールの内容 (ライブラリ ドキュメント コントロールの名前とアドレス) がインポートされます。エクスポートされた関数 (またはクラス) をアプリケーションのコードにコピーすると、アプリケーションが実行されると、ダイナミック リンク ライブラリ内のエクスポートされた関数 (またはクラス) のアドレスを知ることができます。

 二、ダイナミックリンクライブラリdllの分類

簡単に言うと、DLL は非 MFC DLL (Win 32 DLL とも呼ばれる)MFC DLLに分類されます

非 MFC DLL (Non-MFC DLL) は、Win32 DLL とも呼ばれ、MFC クラス ライブラリ構造を使用せずに C または C++ で直接書かれた DLL を指します。エクスポートされた関数は標準の C または C++ インターフェイスであり、非 MFC インターフェイスで使用できます。 -MFC または MFC で書かれたアプリケーションによって呼び出されます。確立された DLL で MFC を使用する必要がない場合は、非 MFC DLL を確立する必要があります。MFC を使用するとユーザー ライブラリのサイズが増加し、ユーザーのディスクとメモリ領域が無駄になるためです。

MFC DLL は、この DLL 内で Microsoft の MFC ライブラリを使用できることを意味しますが、これについてはこの記事の範囲外です。

3. ダイナミックリンクライブラリDLLの開発と呼び出し

有用な DLL を実現するには、DLL 内の変数、関数、またはクラスを最初にエクスポートし、次にコンパイルして DLL ファイルを生成する必要があります。エクスポートは、外部プログラムで使用される変数、関数、またはクラスの宣言です。

通常、次の 2 つのエクスポート方法があります。

1 つ目の方法は、キーワード declspec(dllexport) を使用してエクスポートすることです。

もう 1 つは、モジュール定義ファイル .def を使用してファイルをインポートする方法です (ほとんどの場合、デモなしで使用されることはほとんどありません)。

どの方法でコンパイルしても、最終的には dll ファイルと lib ファイル (インポート ライブラリ ファイル) が生成されます。

3.1 キーワード declspec(dllexport) によるエクスポート

DLL からデータ、関数、クラス、またはクラス メンバー関数をエクスポートするには、キーワード declspec(dllexport) を使用します。この方法は比較的単純で、エクスポートされたコンテンツの前に declspec(dllexport) を追加するだけです。最初のタイプは、次の対で示されています。

(1)、VS の新しいダイナミック リンク ライブラリ DLL;

 (2)、プロジェクト名。ソリューションとプロジェクトを同じディレクトリに配置する場合にチェックを入れます。

 (3)、デフォルトで dllmain.cpp が開きますが、直接閉じてください。

 (4)、プロジェクト、マウスの右ボタン、追加、クラス;

(5)、クラス名を入力します。

 

(5)、AddDll.hとAddDll.cppは以下の通りです。

注: 型宣言の前に「__declspec (dllexport)」が追加されています。ここでクラスが使用されていないのはなぜですか? QLibrary によって呼び出される win32 DLL は C 言語である必要があると測定されます。C++ の場合は、qt を使用する必要があります。 dll自体を作成します。  

 

 

 

(6) 通常、最終的には Release バージョンが必要になりますが、ここでは Debug を Release に変更して生成します。

(7)、プロジェクトの Release ディレクトリで、必要なダイナミック リンク ライブラリ dll ファイルと lib ファイル (インポート ライブラリ ファイル) を見つけます。

 3.2 Qt を介して dll を呼び出す

Qt が DLL のエクスポートされた関数を呼び出す方法は 4 つあります。

1 つ目は、Win32 API を使用する方法です。

2 つ目は、Qt 独自の API を使用する方法です。

3 番目は、DLL を直接呼び出す方法です。

4 番目は Qt Creator の視覚的な呼び出し方法で、マウスをクリックするだけです。

(1)、win32apiを使用

この方法は主に win32 の API 関数 LoadLibrary() を利用しますが、あまり使われていないので興味のある方は以下を参照してください。

(4 メッセージ) 3. Win32 API を使用して DLL_api を呼び出し、dll メソッドを呼び出しますicon-default.png?t=N4P3

(2)、Qt独自のAPI関数QLibraryクラスを使用

この方法は、次に示すように、より一般的な方法の 1 つです。

QLibrary::resolve 関数では、シンボルをライブラリから C 関数としてエクスポートする必要があることが明確に述べられていることに注意してください。

#include "mainwindow.h"

#include <QApplication>
#include <QLibrary>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLibrary lib;
    QString str1 = QApplication::applicationDirPath();
    qDebug()<<"str1="<<str1;
    QString str(str1+"/DllTest.dll" );
    lib.setFileName(str);
    if(lib.load())
    {
         typedef int(*AddFunction)(int a,int b);
         AddFunction Add = reinterpret_cast<AddFunction>(lib.resolve("MyAdd"));
         if(!Add)
         {
             qDebug()<<"resolve failed="<<lib.errorString();
         }
         else
         {
             int out=Add(1,3);
             qDebug()<<"out="<<out;
         }
    }
    else
    {
          qDebug()<<"load failed!";
    }

    MainWindow w;
    w.show();
    return a.exec();
}

 (3)、dllを直接呼び出します。

この場合、これが最も便利ですが、lib、dll、.h ファイル (ソース dll) の 3 つのファイルが必要です。

① 図に示すように、lib を qt の .pro ディレクトリにコピーします。

 ② dll を exe が生成されるディレクトリにコピーします。

 ③qtの.proファイル内の.libを参照します。参照方法は次のとおりです。 -l あなたのlibファイル名;

LIBS+=-L$$PWD/./ -lDllTest

先頭は、絶対パスの下の現在のディレクトリを示します。後でライブラリ名を変更するだけで済みます。たとえば、ライブラリは test123.lib で、末尾は -ltest123 である必要があります。pro ファイルを変更した後は、忘れずに Ctrl + R を押してください。 qt をリロードさせます。

④ソースDLLのヘッダファイルを追加します.エンコード等の問題を防ぐため、原則として.libと同名の.hを新規作成することをお勧めします.下図のように、まずプロジェクトを右クリックします、新しいファイルを追加し、次に C/C++ ヘッダー ファイルを追加し、ライブラリ名を入力して、最後にソース DLL 内のヘッダー ファイル関数をコピーし、__declspec(dllexport) を削除します。

 

 

 ⑤前のステップで作成したヘッダー ファイルをインクルードし、関数を直接呼び出すだけです。

(4)、Qt Creatorのビジュアル呼び出し方法

この方法は上記の 3 番目の方法と似ており、.dll と .lib、および新しい .h ヘッダー ファイルも必要ですが、この方法の利点は、qt が .pro ファイルの変更を自動的に解決することです。

これらの 3 つの手順①②④を最初に実行できます。内容は 3 番目の方法と同じです。dll と .lib を対応する場所にコピーし、.lib と同じ名前で新しい .h ファイルを作成し、内容を記入します。 。

③この手順は少し異なり、下の図に示すように、プロジェクトを右クリックし、ライブラリを追加し、外部ライブラリを選択した後、半分の労力で 2 倍の結果が得られます。

 

 ⑤ このステップは、ヘッダー ファイルも含めて実際には同じで、直接呼び出すだけです。

 

この記事の焦点は、vc を呼び出す qt によって生成される dll について説明することです。vc 間のより柔軟な呼び出しについては、次の記事を参照してください。

(メッセージ数 4) Qt および VS でダイナミック リンク ライブラリ .dll ファイルを使用する ---- 暗黙的なリンクで mode_qt vs dll_coffee および oolong のブログ - CSDN ブログ https://blog.csdn.net /qq_40459977/ icon-default.png?t=N4P3article/details/125652187 独自性簡単ではありませんが、お役に立てれば、注意して、qt6 関連のコンテンツをさらに出力し続けてください。

おすすめ

転載: blog.csdn.net/yanchenyu365/article/details/131046583