■ 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 )という名前で記録させる