-2


何よりも先に、この問題についてここで他の質問を見つけたと言いたいのですが、これは少し異なります

私がプラグイン システムに望む唯一のことは、プラグインが私の関数をフックできること
です。私はこの関数を持っていると思います:

DWORD TestFunc(int Number)
{
   printf("The number is %i", Number);

   // Plugin codes here

   return 0; // Return when we have done our job
}

配置した場所にプラグインコードをここに配置// Plugin codes hereして、関数スタックを使用し、関数呼び出しのたびに関数にコードを追加できるようにします

したがって、プラグインコードは次のようになります

Hook(char* FuncName, LPVOID /* or DWORD */ PluginFunc);

上記のサンプルでは FuncName はどれで、PluginFunc"TestFunc"はプラグイン内の関数のアドレスになります。

インターネットを検索する運がないので、ここで解決策を見つけられることを願っています(外部ライブラリまたはアイデアである可能性があります)

4

1 に答える 1

1

その機能をクラスにカプセル化して、たとえば 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);
于 2013-10-24T16:40:55.950 に答える