VC++6.0でのDLLの遅延ロード(Delay Load)
リンク: リンカによる DLL の遅延読み込み.
仕事の都合で、DLLの遅延ロード(Delay Load)についていろいろと調べていた。もともと、DLLのロード方法には、暗黙的な方法と明示的な方法と2通りある。
暗黙的な方法では、DLLが存在していない場合には、アプリケーション自体が起動しない。明示的な方法では、DLLが存在しない場合にはエラー処理としてアプリケーションの動きを制御することができる。だが、LoadLibrary()やGetProcAddress()などの処理を書かなければならず、少し面倒。
VC++6.0から導入された遅延ロード(Delay Load)または遅延読み込みを使えば、コーディング字体は暗黙的な方法で行うことができ、その処理(コード)が実行される時点でDLLがロードされる。暗黙的な方法と明示的な方法の良いとこ取りをしたような感じだ。
だが、意外と、遅延ロードに関する情報が少なかったように思う。メモも兼ねて、簡単なサンプルを、以下にまとめておく。
遅延ロードを実現するためだけの最小限のコード。もしかしたら、環境によってはビルドが通らなかったりする可能性がある。includeやlibのパスは、適宜、設定すること。
hello.exe
hello.cpp
#include#include "Hellodll.h"
#pragma comment (lib, "hellodll.lib")
#pragma comment (lib, "delayimp.lib")
#pragma comment (linker, "/delayload:hellodll.dll")void main()
{
printf("%s", Hello());
}
hellodll.dll
hellodll.cpp
#include "Hellodll.h"extern "C" int APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpRsv)
{
return TRUE;
}HELLODLL_API const char* __stdcall Hello()
{
return "Hello World!\n";
}
hellodll.h
#ifndef __Hellodll_H
#define __Hellodll_H#ifdef HELLODLL_EXPORTS
#define HELLODLL_API __declspec(dllexport)
#else
#define HELLODLL_API __declspec(dllimport)
#endif#include
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
HELLODLL_API const char* __stdcall Hello();#ifdef __cplusplus
}
#endif // __cplusplus#endif //__Hellodll_H
| 固定リンク

コメント