如前所述,我正在尝试为 LNK2019 问题找到一种解决方法,该问题在构建使用 C++ 模板的静态库时出现,并将源代码与标头分离以使代码对其他项目保持私有。我相信我几乎已经得出了一个可行的结论(针对我的特殊情况),但我不完全确定这是否是正确/最佳的解决方法,并且想知道是否有人有任何建议、改进/评论添加?
目标是做一些类型检查,看看模板的签名是否与目标原型函数的签名匹配,做一些私有处理,并返回它是否成功。请注意,我已从上述链接中的解决方案的先前版本中删除SdkHookMgr.h
andSdkHookMgr.cpp
,并将所有内容重新合并到SdkLib.h
andSdkLib.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;