我的解决方案分为 3 个项目。第一个是 MFC (GUI) 应用程序,第二个是静态库,第三个是 DLL。DLL 依赖于静态库,而 GUI 依赖于两者。这里的想法是编写一个带有演示插件 (DLL) 的 SDK(静态库),MFC (GUI) 应用程序使用该插件。
话虽如此,SDK 包含模板函数,允许插件开发人员选择要挂钩的原型函数。但是 dll 与 lib 似乎存在实现问题......
SDKLib.h:
#define MY_EXPORTS
#include "SdkHookMgr.h"
// Prototypes
typedef HMODULE (WINAPI *HookLoadLibraryA)( LPCSTR lpFileName );
typedef HMODULE (WINAPI *HookLoadLibraryW)( LPWSTR lpFileName );
SdkHookMgr.h:
#ifdef MY_EXPORTS
#define MY_API __declspec(dllexport) WINAPI
#else
#define MY_API WINAPI
#endif
template <typename HookFunction>
BOOL MY_API Hook(HookFunction Target);
SdkHookMgr.cpp:
#include "SdkHookMgr.h"
template <typename HookFunction>
BOOL MY_API Hook(HookFunction Target)
{
switch( typeid(Target) )
{
case HookLoadLibraryA:
// Use private SDK functions to hook LoadLibraryA
break;
case HookLoadLibraryW:
// Use private SDK functions to hook LoadLibraryW
break;
//...
default:
return FALSE;
}
return TRUE;
}
demodll.cpp:
#include <SdkLib.h>
HMODULE WINAPI Hooked_LoadLibraryA ( LPCSTR lpFileName )
{
//...
}
//...
Hook<HookLoadLibraryA>(Hooked_LoadLibraryA);
这里的问题是 lib 编译得很好,但是 dll 显示:
demodll.obj : error LNK2019: unresolved external symbol "int __stdcall Hook<struct HINSTANCE__ * (__stdcall*)(char const *)>(struct HINSTANCE__ * (__stdcall*)(char const *))"
我想发生的事情是 lib 看到了实现SdkHookMgr.cpp
,但 dll 没有(即使它与 sdklib.lib 链接)。我真的很喜欢在调用Hook()
函数时限制开发人员使用具有相同签名的原型和函数的想法,并且计算模板是最好的方法......但是我怎样才能绕过这个漏洞而不必包含Hook()
within的实现SdkHookMgr.h
呢?构建静态库的目的是首先避免插件开发人员戳 SDK 的源代码......