« 身体に戻るということ | トップページ | 相手に合わせるということ »

2008年3月11日 (火)

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

|

« 身体に戻るということ | トップページ | 相手に合わせるということ »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/127316/40467738

この記事へのトラックバック一覧です: VC++6.0でのDLLの遅延ロード(Delay Load):

» VC 6.0でDLLロードにLoadLibrary APIを使う [うまくいっていることは何ですか?]
先日のエントリの続き。LoadLibrary APIを使用した、明示的なDLLの [続きを読む]

受信: 2008年3月17日 (月) 15時21分

« 身体に戻るということ | トップページ | 相手に合わせるということ »