DLL





LoadLibrary


SYNTAX HMODULE LoadLibrary( LPCTSTR path // DLL file PATH ( FullPath || FileName ) ); DESC DLL を呼び出し Process の Address 空間に map する CntRef をひとつ増やす Program は { data, 命令 }.( Instruction )でできていることの証明 変数: data の置かれている, Memory のアドレスへの Label( 名前 ) 関数: 命令の置かれている, Memory のアドレスへの Label( 名前 ) -> やはり, 基本は何もかわっていない POINT Address が UserAdress にあることに注目 -> OS 本体に App が直接アクセスさせないための安全措置 Program を Rebuild しなくても動的に機能の追加が可能 POINT 取得したアドレスを適切な関数型に変換
typedef int (*FN)( HWND, LPCTSTR, LPCTSTR, UINT );
{ // File 名なら 検索順どおり HINSTANCE h = LoadLibrary( "user32.dll" ); // FullPath HINSTANCE h = LoadLibrary( "c:/windows/user32.dll" ); FN f; f = (FN)(GetProcAddress( h, "MessageBoxA")); (*f)( 0, "koreha", "yoberu", MB_OK ); } { hDll = LoadLibrary(_T("libcgc.dll")); COMPILE_PS3 DllCompile; DllCompile = (COMPILE_PS3)GetProcAddress( hDll, "compile_program_from_string" ); uint32_t ret = DllCompile( source.c_str(), "sce_fp_rsx", 0, option, &buffer ); }
// 0x77d3058a // 2G 以下 TCHAR str[NAME_SIZE]; wsprintf( str, "adr %08x", f); dws( str ); void func(){ .... } { int adr = ( (int)func ); ( *( (FN)adr ) )(); } SYNTAX BOOL FreeLibrary( HMODULE ); DESC refcnt をひとつ減らす. ( 0 ならば ProcessSpace から unmap ) RET 0 : SUCCESS


GetProcAddress


SYNTAX HINSTNCE GetProcAddress( HMODULE, LPCTSTR ); DESC DLL がもつ Export された関数の Address をえる WARNING C Linkage extern "C" をしないと, 名前修飾 のため検索に失敗する
// dll.cpp // ERROR __declspec( dllexport ) func(); // OK extern "C" __declspec( dllexport ) func(); // main.cpp GetProcAddress( h, "func" );
POINT [.] __declspec( dllexport )宣言で DLL file 内に 関数名が記録される [.] extern "C" で 名前修飾 をふせぐ ( func )という名前で記録させる