前にここで説明したように、C++ テンプレートを使用するスタティック ライブラリをビルドし、ソースをヘッダーから分離して、コードを他のプロジェクトからプライベートに保つときに発生する LNK2019 問題の回避策を見つけようとしています。私は(私の特定の状況では)ほぼ結論に達したと信じていますが、これが正しい/最善の方法であるかどうかは完全にはわかりません.追加?
目標は、型チェックを行って、テンプレートの署名がターゲット プロトタイプ関数の署名と一致するかどうかを確認し、プライベートな処理を行い、それが成功したかどうかを返すことです。上記のリンクのソリューションの以前のバージョンからとを削除し、すべてを と にマージして、少し明確にするために静的クラスに戻したことに注意しSdkHookMgr.h
SdkHookMgr.cpp
SdkLib.h
てくださいSdkLib.cpp
。
SdkLib.h:
#include <typeinfo>
#ifdef MY_EXPORTS
# define MYDECL __declspec(dllexport)
#else
# define MYDECL
#endif
// Prototypes
typedef HMODULE (WINAPI *HookLoadLibraryA)( LPCSTR lpFileName );
//...
class CHook;
class CHookManager;
MYDECL BOOL WINAPI ValidateHook( CHook *hook );
class CHook
{
public:
CHook() : m_type(NULL), m_target(NULL), m_result(FALSE) {};
CHook( const char *type, PVOID target ) : m_type(type), m_target(target) {
m_result = ValidateHook(this);
};
const char *m_type;
PVOID m_target;
BOOL m_result;
};
class CHookManager
{
public:
template <typename HookFunction> static BOOL Hook(HookFunction target)
{
const type_info& type = typeid(HookFunction);
CHook *hook = new CHook( type.name(), target );
return hook->m_result;
}
};
SdkLib.cpp:
#include <SdkLib.h>
IDXDECL BOOL WINAPI ValidateHook( CHook *hook )
{
// Do type checking, private processing, etc here...
return TRUE;
}
デモDLL.cpp:
#include <SdkLib.h>
HMODULE WINAPI Hooked_LoadLibraryA( LPCSTR lpFileName )
{
DebugBreak();
}
// The function that starts the rollercoaster.
// - Syntax: Hook< prototype >( target )
if!(CHookManager::Hook<HookLoadLibraryA>(Hooked_LoadLibraryA))
cout << "Failed to create hook for LoadLibraryA!" << endl;