最終更新:
bokkuri_orz 2012年03月30日(金) 04:05:43履歴
| 関連ファイル | 使い方 | |
| 静的リンク | *.obj, *.lib | 普通に実行ファイルにリンクする。 |
| DLL(暗黙的なリンク) | *.lib, *.dll | dll関数は __declspec(dllimport) でプロトタイプ宣言する。 リンク時に *.libが必要。 |
| DLL(明示的なリンク) | *.dll | *.lib不要。 LoadLiblary, GetProcAddress, FreeLibrary を使う。 |
sub.c
#include <stdio.h>
__declspec(dllexport) int sub(int arg)
{
printf("sub %d\n", arg);
return arg + 1;
}
main_static.c
#include <stdio.h>
__declspec(dllimport) int sub(int);
int main(void)
{
printf("main %d\n", sub(1));
return 0;
}
main_dynamic.c
#include <stdio.h>
#include <windows.h>
int main(void)
{
HINSTANCE hDLL;
int (*func)(int);
if ((hDLL = LoadLibrary("sub.dll")) == NULL)
printf("LoadLibrary is failed.\n");
else {
if ((func = (int (*)(int))GetProcAddress(hDLL, "sub")) == NULL)
printf("GetProcAddress is failed.\n");
else
printf("main %d\n", func(1));
FreeLibrary(hDLL);
}
return 0;
}
MSDNリファレンス : DLL(Dynamic Link Library)
http://msdn.microsoft.com/ja-jp/library/cc429019.a...
MSDN DLL
http://msdn.microsoft.com/ja-jp/library/1ez7dh12(v...
KAB-studio > プログラミング > Codian > DLLを使おう!!
http://www.kab-studio.biz/Programing/Codian/DLL_Ho...
順に読んでいくと分かりやすいと思います。
フックの話題もあります。
WinMain()のDLL版。
DLLのエントリーポイント。
環境に寄って、DllMain, DllEntryPoint のどちらかが使われることが多い。
DLLの初期化や終了処理の手段?
ちょっと実験してみた。
bool WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpReserved)
{
printf("DllMain\n");
return 1;
}
DllMainはアプリの起動時(DLL読み込み時)、アプリの終了時(DLL解放時)に呼ばれていた。
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
printf("DllEntryPoint\n");
return 1;
}
DllEntryPointは、一度も呼ばれなかった。何か設定が必要?
アセンブラレベルで違いがあるとのこと。
| 呼出規約 | 動作 | 備考 |
| stdcall | 呼び出した先でスタックポインタ(ESP)を戻してもらう。(RET時に戻す) | 関数呼び出しで、cddeclよりサイズが小さい DLL等で使う(WINAPI) |
| cdecl | 呼び出し元でESPをクリーンアップする。RETはリターンするだけ。 | |
| fastcall | 引数は利用可能な数だけレジスタを使う。 |
WeBlog of Sky color
http://pinako.blog33.fc2.com/blog-entry-83.html
prasinos' work memo
http://prasinos.blog2.fc2.com/blog-entry-627.html
プラグイン作成と併せて説明されています
http://blackscarecrow.sakura.ne.jp/junk/C&C++/PP01...
ビルド後のマップファイルを眺めて、関数名が加工されているのをよく見かけた。
コンパイラごとに規則があって(当然か…)、名前修飾というのが行われた結果らしい。
下の参考サイトから抜き出し…
●C++
| 関数名 | void h(int) | void h(int, char) | void h(void) |
| 装飾名 | ?h@@YAXH@Z | ?h@@YAXHD@Z | ?h@@YAXXZ |
●C (extern "C"とか)
| 関数名 | void h(int) | void h(int, char) | void h(void) |
| 装飾名(cdecl) | _h | _h | _h |
| 装飾名(stdcall) | _h@4 | _h@5 | _h@0 |
| 装飾名(fastcall) | @h@4 | @h@5 | @h@0 |
http://blackscarecrow.sakura.ne.jp/junk/C&C++/PP01...
Wikipedia
http://ja.wikipedia.org/wiki/%E5%90%8D%E5%89%8D%E4...
タグ


最新コメント