__declspec(dllimport)
を使用してデータをインポートする
データの場合、__declspec(dllimport)
の使用は、間接参照のレイヤーを削除するのに便利です。 DLL からデータをインポートする場合は、引き続きインポート アドレス テーブルを参照する必要があります。 __declspec(dllimport)
の前は、これは、DLL からエクスポートされたデータにアクセスするときに、追加のレベルの間接参照を忘れずに実行する必要があることを意味していました。
// project.h
// Define PROJECT_EXPORTS when building your DLL
#ifdef PROJECT_EXPORTS // If accessing the data from inside the DLL
ULONG ulDataInDll;
#else // If accessing the data from outside the DLL
ULONG *ulDataInDll;
#endif
その後、データを DEF ファイルにエクスポートし、
// project.def
LIBRARY project
EXPORTS
ulDataInDll CONSTANT
DLL の外部でそれにアクセスします。
if (*ulDataInDll == 0L)
{
// Do stuff here
}
データを __declspec(dllimport)
とマークすると、コンパイラによって間接参照コードが自動的に生成されます。 上記の手順について心配する必要はなくなります。 前述したように、DLL をビルドするときは、データに対して __declspec(dllimport)
宣言を使用しないでください。 DLL 内の関数では、データ オブジェクトにアクセスするためにインポート アドレス テーブルは使用されません。したがって、追加レベルの間接参照は存在しません。
DLL からデータを自動的にエクスポートするには、次の宣言を使用します。
// project.h
// Define PROJECT_EXPORTS when building your DLL
#ifdef PROJECT_EXPORTS // If accessing the data from inside the DLL
__declspec(dllexport) ULONG ulDataInDLL;
#else // If accessing the data from outside the DLL
__declspec(dllimport) ULONG ulDataInDLL;
#endif