その機能をクラスにカプセル化して、たとえば HookManager のように呼び出します。
class HookManager {
public:
void registerHook( const std::string &name, std::function<...> hook );
void callHooks( const std::string &name );
...
};
もちろん、実際の署名を入れて、それに応じstd::function<...>
て変更する必要がありますcallHooks()
。したがって、テスト関数内でフック マネージャーを呼び出します。
DWORD TestFunc(int Number)
{
printf("The number is %i", Number);
// Plugin codes here
hookManager.callHooks( "TestFunc" );
return 0; // Return when we have done our job
}
__func__
関数名をハードコーディングする代わりに、おそらくそこで使用できます。フック マネージャー オブジェクトの場合は、おそらくシングルトン パターンを使用するか、そのオブジェクトをパラメーターとしてプラグインの初期化コードとフックを呼び出す必要がある関数に渡すことができます。シングルトンを使用する場合、DLL の内部:
void TestFuncHook();
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
HookManager &hookManager = HookManager::instance();
hookManager.registerHook( "TestFunc", std::bind( TestFuncHook ) );
...
}
フック関数がフックの署名と一致する場合は、std::bind を省略できます。別の解決策は、フックマネージャーをパラメーターとして受け入れる、定義済みの名前を持つ初期化関数をプラグインに要求することです。
extern "C"
void initializeMyPlugin( HookManager &hookManager )
{
hookManager.registerHook( "TestFunc", std::bind( TestFuncHook ) );
}
DLL をロードするときに、メイン アプリで初期化関数を検索します。
HMODULE module = LoadLibrary( "somelibrary.dll" );
FARPROC proc = GetProcAddress( module, "_initializeMyPlugin" );
if( !proc ) {
// it is not a plugin!
return;
}
typedef void (*InitilizeFuncPtr)( HookManager & );
reinterpret_cast<InitilizeFuncPtr>( proc )( hookManager);