解决LNK2019 C ++模板问题?

时间:2012-11-09 12:59:48

标签: c++ templates dll prototype

  

可能重复:
  Why do I get “unresolved external symbol” errors when using templates?

我的解决方案分为3个项目。第一个是MFC(GUI)应用程序,第二个是静态库,第三个是DLL。 DLL依赖于静态lib,GUI依赖于两者。这里的想法是编写一个SDK(静态库),其中包含一个MFC(GUI)应用程序使用的演示插件(DLL)。

话虽如此,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()函数时限制开发人员使用具有相同签名的原型和函数的想法,并且认为模板是最好的方法...... 但我怎样才能绕过这个漏洞< / strong>而不必在Hook()中包含SdkHookMgr.h的实施?构建静态库的目的是为了避免插件开发人员首先使用SDK的源代码...

0 个答案:

没有答案