Visual Studioを用いたダイナミックリンクライブラリ開発プロセス


一、ダイナミックリンクライブラリとダイナミックリンク
ダイナミックリンクライブラリ:Windowsでは、動的リンクライブラリ(DLL)は、関数とリソースの共有ライブラリとして実行可能ファイルである。それらを呼び出すアプリケーションのコンテキストで動作します。
ダイナミックリンク:ダイナミックリンクはオペレーティングシステムの機能です。オペレーティングシステムは、DLLをアプリケーションのメモリ空間にロードし、ファイル起動関数を実行するか、または個別ファイルに格納されたリソースを使用することができる。
動的リンクライブラリは何のために使われていますか?DLLは、実行可能ファイル間で関数とリソースを簡単に共有することができます。複数のアプリケーションは、メモリ内の単一DLLレプリカのコンテンツに同時にアクセスすることができる。
二、静的リンクの違い
この部分は静的リンクが実行に必要なすべてのライブラリを実行ファイルにパッケージ化していることを知る必要があります。動的リンクは各ライブラリを独立して実行しているときにオペレーティングシステムによってDLLをアプリケーションのメモリ空間にロードします。
Windowsで具体的には、
スタティックリンクは、スタティックライブラリ内のすべてのオブジェクトコードを生成時に使用する実行可能ファイルにコピーします。動的リンクは、Windowsが実行中にデータ項目または関数を含むDLLを検索およびローディングするために必要な情報のみを含む。DLLを作成すると、この情報を含むインポートライブラリも作成されます。DLLを呼び出す実行可能ファイルを生成すると、リンク器は導入ライブラリの中の導出記号を使ってWindowsローディングプログラムにこの情報を格納します。DLLをロードすると、DLLはあなたのアプリケーションのメモリ空間にマッピングされます。存在する場合、DLLの特殊関数DllMainを呼び出して、DLLに必要な任意の初期化を実行する。
マイクロソフト技術文書の紹介を直接見て、青をクリックしてアクセスすることもできます。
三、VSでダイナミックライブラリを生成する基本的な流れ
ここではC++言語を使って開発しています。環境に対する要求は以下の通りです。
1、Visual Studio。
2、VSには「C++のデスクトップ開発」の作業負荷が取り付けられています。Visual Studioをインストールしていない場合は、インストールプログラムを再起動してすぐにインストールすることができます。
Visual Studioのインストールと構成は、このリンクを参照してくださいをクリックして、青をクリックしてアクセスできます。
具体的な手順は以下の通りです。
①Visual Studio 2019にDLLプロジェクトを作成する
メニューバーで「ファイル」「新規作成」「項目」を選択し、「新規プロジェクトの作成」ダイアログを開きます。下図のような項目の種類を選択します。
在这里插入图片描述
次に、DLL導出の関数を宣言するためのヘッダファイルを作成し、DLLに関数定義を追加し、より強力な機能(他の実行ファイルによって呼び出される)を備えさせる。
②ヘッダファイルをDLL(.hファイル)に追加する
関数の先頭ファイルを作成するには、メニューバーで「項目」「新規項目を追加」を選択してください。つまり、このプロジェクトに先頭のファイルを追加します。みんなはどのようにするかを知っているはずです。
凡例はMathLibrary.hというヘッダファイルを追加しました。ここではどんな名前を使ってもいいです。主に操作手順を見ます。私たちは統一的にDiyApi.hに設定しました。
在这里插入图片描述
その後、頭ファイルDiyApi.hの内容をこう書きます。

#pragma once
//      API   
//    GetNumber_8()     __declspec(dllexport)    。
extern "C" __declspec(dllexport) int GetNumber_8();
ここでの関数GetNumber_8()は、他の実行ファイルによって呼び出されるための、私たちのDLLのAPIとして機能する。__declspec(dllexport)は、コンパイラおよびリンク器がDLLから関数または変数を導出することを示し、他のアプリケーションがそれを使用できるようにする。この修飾子は、アプリケーションにおける関数または変数の導入を最適化します。マイクロソフトの説明文書を参照して、青い字をクリックしてください。
③DLLへの追加実現(.cファイル)
過程を強調するか、関数の機能を簡単にします。

#include "DiyApi.h"
#include <stdio.h>
/** 
	brief:  int     8
	arg:None
	retval:8
**/
int GetNumber_8()
{
	int ConstNumber = 8;
    return ConstNumber;
}
動的リンクライブラリがコンパイルされ、DLLおよび関連コンパイラがソリューションフォルダの直下にある「Debug」フォルダに出力されます。リリースバージョンが作成されると(Realse)、出力は「Release」フォルダに配置されます。VSの出力は以下と同様であるべきである。
在这里插入图片描述
四、どうやってダイナミックリンクライブラリを使うか
明らかに、私達が自分で書いたダイナミックライブラリ(DLL)であろうと、他のソースのダイナミックライブラリであろうと、まず考えなければならない問題はどのようにそれを私達のプロジェクトに使うかです。これはつまりどうやって動的リンクライブラリを使うかという問題です。
マイクロソフト文書によると、
関数を呼び出したり、DLLで導出されたデータにアクセスする場合、クライアントソースコードは、コンパイル時に利用可能な声明を持つ必要がある。リンク時間には、関数の呼び出しやデータのアクセスを解析するための情報が必要です。
つまり、少なくとも二つのことを確保するということです。
①IDEダイナミックライブラリの位置を知っていますので、コンパイルがスムーズに進みます。
②私達が発表したアプリケーションはダイナミックライブラリを見つけて、プログラムが実行できるようにする。
したがって、私たちは主に以下の原則に従うべきです。
まず、同期されていないコードを回避するために、DLLプロジェクトのDLLヘッダファイルを直接含ませるように、クライアント項目に経路を含むように設定することを提案する。
また、DLLプロジェクトのDLLインポートライブラリを含むライブラリパスをクライアントアイテムに設定する。
最後に、生成されたDLLは、DLLプロジェクトからクライアント生成出力ディレクトリにコピーされる。このステップは、クライアントアプリケーションが生成された同一のDLLコードを使用することを可能にする。
この問題を明確に説明するために、私たちはプロセスを歩いてみます。まず、新しいプロジェクトApiClientを作成し、このプロジェクトで以前に作成したDLLGetNumber_8()を呼び出す。
在这里插入图片描述
プロジェクトにDLLを追加します。
次に、ソースコードでGetNumber_8関数を呼び出すには、あなたのプロジェクトはDiyApi.hファイルを含む必要があります。不必要なトラブルを避けるために、以下の手順を採用します。
1、「ソリューションリソースマネージャ」の「AppliClient」ノードを右クリックして「プロパティページ」ダイアログを開きます。
2、「設定」プルダウンボックスで、「すべての設定」を選択します。
3、左ペインでは、「プロファイル」>「C/C+」「全般」を選択します。
4、プロパティペインで、「目次を含む」編集ボックスの横にあるドロップダウンコントロールを選択し、「編集」を選択します。
在这里插入图片描述
5、「目次を含む追加」ダイアログの上部ペインでダブルクリックしてコントロールの編集を有効にします。または、フォルダアイコンを選択して、新しいエントリを作成します。
6、編集コントロールでは、ApiClient.hヘッダのファイルの位置を指すパスを指定します。省略記号(...)コントロールを選択して正しいフォルダにブラウズできます。
また、DLLヘッダのファイルを含むフォルダにクライアントソースファイルの相対パスを入力しても良い。指示に従って、クライアント項目をDLLの別個の解決策に配置した場合、対応する経路は以下の通りであるべきである。

..\..\DiyApi\DiyApi
DLLとクライアント・プロジェクトが同じ解決策にある場合、相対パスは以下のように示されていてもよい。

..\DiyApi
DLLとクライアント項目が他のフォルダにある場合、マッチングのために相対パスを調整してください。または、省略記号コントロールを使ってフォルダをブラウズします。
7、「項目を含む追加」ダイアログでヘッダファイルのパスを入力し、「決定」ボタンを選択します。「プロパティーページ」ダイアログで、「決定」ボタンを選択して変更を保存します。
今はDiyApi.hファイルを含み、クライアント・アプリケーションで宣言された関数を使用することができる。対応するApiClient.cppの内容は以下の通りである。

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

using namespace std;
 
int main()
{
	const magicNumber = 8;
	/*   magicNumber   8    */
	for(int i=magicNumber;i>0;i--){
		cout<<GetNumber_8<<endl;
	}
	return 0;
}
コンパイルを試してみましたが、すばらしいです。😀,私たちは一山の新聞ミスを得ることができます。少なくとも次のようなものがあります。

LNK2019 :         DiyApi.lib       
私たちはまだリンク器にDiyApi.libファイルの検索方法を教えていません。コンパイルする前に、プロジェクトの「追加ライブラリディレクトリ」のパスを設定して、リンクする時に元のライブラリに向かうパスを含めて、もうすぐDLL がプロジェクトに追加されます。
DLLインポートライブラリをプロジェクトに追加する(リンク準備)
1、「ソリューションリソースマネージャ」のApiClientノードを右クリックし、「プロパティ」を選択して「プロパティページ」ダイアログを開きます。
2、「設定」プルダウンボックスで、「すべての設定」を選択します。任意の属性変更がデバッグとリリースに同時に適用されることを確認します。
3、左ペインでは、「プロファイル」「リンク」「入力」を選択します。属性ペインでは、「依存関係の追加」ボックスの横にあるドロップダウンコントロールを選択し、「編集」を選択します。
在这里插入图片描述
4、「追加依存項」(Additional Dependencies)ダイアログで、上位編集コントロールのリストにDiyApp.libを追加します。
5、「決定」を選択して「プロパティーページ」ダイアログに戻ります。
6、左ペインでは、「プロファイル」「リンク」「全般」を選択します。属性ペインで「ライブラリの追加」を選択し、ボックスの横にあるドロップダウンコントロールを編集し、「編集」を選択します。
7、「ライブラリの追加」ダイアログの上のペインでダブルクリックしてコントロールの編集を有効にします。編集コントロールでは、DiyApi.libファイルの位置を指すパスを指定します。デフォルトでは、DLLソリューションフォルダ下のDebugフォルダにあります。リリースバージョンを作成すると、Releaseフォルダにファイルが置かれます。マクロは、どのバージョンを作成したかにかかわらず、$指示に従って、クライアント項目をDLLプロジェクトの別の解決策に配置した場合、対応する経路は以下のようになるべきである。

..\..\DiyApi\$(IntDir)
DLLとクライアント項目が他の位置にある場合、マッチングのために相対パスを調整してください。
8、「ライブラリの追加」ダイアログでライブラリファイルへのパスを入力し、「決定」ボタンを選択して「プロパティーページ」ダイアログに戻ります。属性変更を保存するために「決定」を選択します。
DLLをアプリケーションフォルダにコピーする(運転準備)
クライアントアプリケーションは現在、コンパイルとリンクに成功していますが、まだ実行されていません。オペレーティングシステムがアプリケーションをロードすると、DLLが検索される。いくつかのシステムディレクトリ、環境パス、またはローカルアプリケーションディレクトリにこのDiyApi.DLLが見つからないと、このアプリケーションは自然に実行できなくなります。
したがって、実行可能なファイルを含むディレクトリにDLLをコピーする必要があります。つまり、「パッケージリリース」プロセスの一部です。
もちろん、Visual Studioは対応するコマンドを提供しています。手動で梱包したくない場合は、マイクロソフトドキュメントの生成後イベント中にDLLをコピーするでの説明を参照して、クリックしてください。
ここで、Visual Studioを使ったダイナミックリンクライブラリの開発に関する記事を紹介します。Visual Studioの動的リンクライブラリの内容については、以前の文章を検索したり、以下の関連記事を見たりしてください。これからもよろしくお願いします。