最終更新: 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...
タグ
最新コメント