RAD Studio での DLL の使用(C++)
パッケージと DLL の作成 への移動
RAD Studio では、Windows と macOS のどちらの場合にもダイナミック リンク ライブラリをサポートしています(前者の場合は DLL ファイル、後者の場合は dylib ファイル)。
ダイナミック リンク ライブラリを作成するには、まず[ファイル|新規作成|その他...]を選択します。 [C++Builder プロジェクト]ノードから、[ダイナミックリンク ライブラリ]を選択します。
新規作成されたプロジェクトのメイン ファイルに、以下のコードが自動的に生成されます。
// Important note about DLL memory management when your DLL uses the
// static version of the RunTime Library:
//
// If your DLL exports any functions that pass String objects (or structs/
// classes containing nested Strings) as parameter or function results,
// you will need to add the library MEMMGR.LIB to both the DLL project and
// any other projects that use the DLL. You will also need to use MEMMGR.LIB
// if any other projects which use the DLL will be performing new or delete
// operations on any non-TObject-derived classes which are exported from the
// DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
// EXE's to use the BORLNDMM.DLL as their memory manager. In these cases,
// the file BORLNDMM.DLL should be deployed along with your DLL.
//
// To avoid using BORLNDMM.DLL, pass string information using "char *" or
// ShortString parameters.
//
// If your DLL uses the dynamic version of the RTL, you do not need to
// explicitly add MEMMGR.LIB as this will be done implicitly for you
#pragma hdrstop
#pragma argsused
extern "C" int _libmain(unsigned long reason)
{
return 1;
}
_libmain 関数はダイナミックリンク ライブラリへのエントリ ポイントです。 ダイナミックリンク ライブラリが読み込まれると、_libmain 関数が呼び出されます。 この関数には通常、初期化コードが記述されます。
関数のエクスポート
ダイナミックリンク ライブラリに定義されている関数をそのライブラリの外部から参照できるようにするには、それらの関数をエクスポートする必要があります。 関数をエクスポートするための構文は次のとおりです。
extern "C" __declspec(dllexport) <return_type> <function_name>(<function_parameters>);
関数のインポート
ダイナミックリンク ライブラリに定義されている関数を使用するには、その関数をインポートする関数として宣言し、その関数が定義されているライブラリを読み込んだあと、関数にアクセスする必要があります。 関数をインポートするための構文は次のとおりです。
extern "C" __declspec(dllimport) <return_type> <function_name>(<function_parameters>);
メモ: インポートする関数のプロトタイプは、ダイナミックリンク ライブラリ内部の関数定義に一致する必要があります。
ダイナミックリンク ライブラリの使用
ダイナミックリンク ライブラリからエクスポートされている関数を呼び出すには、そのライブラリをメモリに読み込む必要があり、その関数をインポートする関数として宣言する必要があります。 ライブラリを読み込むには 2 つの方法があります。つまり、静的読み込み(リンク時)と動的読み込み(実行時)です。
ライブラリを静的に読み込む
Win32 および Win64 をターゲットとする際、インポート ライブラリをコードからプロジェクトに追加することができます。これを行うには、プロジェクトのソース ファイルに次の pragma
指令を挿入します:
#pragma comment(lib, "TestDLL")
メモ: ファイル名には拡張子は含まれない点に注意してください。
Win32 をターゲットとする場合、この方法はダイナミックリンク ライブラリを、.lib
拡張子のインポート ライブラリを通じてバインドする必要があります。Win64 をターゲットとする場合、この方法はダイナミックリンク ライブラリを、.a
拡張子のインポート ライブラリを通じてバインドする必要があります。 インポート ライブラリはダイナミックリンク ライブラリ プロジェクトで自動的に生成されます。
WIN32 のみまたは WIN64 のみをターゲットとする場合、プロジェクト マネージャでプロジェクトを右クリックし、[追加...]を選択することで、pragma
の代わりに、インポート ライブラリをプロジェクトに追加することができます。インポート ライブラリがプロジェクトに追加されたら、目的とする関数がインポートされたことを確かめます(上記のインポート構文を使用します)。 これで、これらの関数をプロジェクトで使用できます。
メモ: ダイナミックリンク ライブラリ プロジェクトの[インポート ライブラリを生成]オプションを必ず[True]に設定してください。それにより、プロジェクトのビルド時にインポート ライブラリ(.lib ファイル)が生成されるようになります。 詳細は、「C++ リンカ」を参照してください。
ライブラリを動的に読み込む
インポートする関数を宣言したら、ダイナミックリンク ライブラリを実行時に読み込む必要があります。 この操作は、LoadLibrary
関数を使って行います。
ライブラリがメモリ内に読み込まれたら、GetProcAddress
関数を使用して、特定の関数のポインタを取得します。
C++Builder アプリケーションにおけるダイナミック ライブラリの利用の詳細例です: チュートリアル:C++Builder アプリケーションでダイナミック リンク ライブラリを使用する。