我正在尝试按照此网站上的说明进行操作: http : //support.microsoft.com/kb/q168958
这里是代码:
#include <windows.h> #include <malloc.h> namespace Test { template<class TYPE> class TestBuffer { private: TYPE* m_pData; size_t m_uSize; public: TestBuffer(size_t uSize) : m_pData(NULL), m_uSize(0) { m_pData = (TYPE*)malloc(uSize * sizeof(TYPE)); } ~TestBuffer() { if (NULL != m_pData) free(m_pData); } public: bool IsValid() const { return NULL != m_pData; } operator TYPE*() const { return m_pData; } }; template class __declspec(dllexport) Test::TestBuffer<wchar_t>; __declspec(dllexport) bool GetCurrentDir(char* szDir, size_t uSize) { DWORD dwRequiredSize = ::GetCurrentDirectoryW(0, NULL); Test::TestBuffer<wchar_t> wideCharBuffer(size_t(dwRequiredSize)); bool bResult = (dwRequiredSize - 1 == ::GetCurrentDirectoryW(dwRequiredSize, (wchar_t*)wideCharBuffer)); wcstombs(szDir, (wchar_t*)wideCharBuffer, uSize); return bResult; } } // namespace Test BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) { char szPath[MAX_PATH] = { 0 }; Test::GetCurrentDir(szPath, MAX_PATH); return TRUE; }
把它放在VS中的WIN32 DLL项目中会出现以下错误:
error LNK2019: unresolved external symbol "class Test::TestBuffer<wchar_t> __cdecl wideCharBuffer(unsigned int)" (?wideCharBuffer@@YA?AV?$TestBuffer@_W@Test@@I@Z) referenced in function "bool __cdecl Test::GetCurrentDir(char *,unsigned int)"
我不知道为什么链接器找不到定义,因为所有的东西都是在那里定义的,还有TestBuffer的导出语句。 另外,在这个例子中,我甚至不需要导出TestBuffer的显式实例化,因为它没有被暴露在DLL接口中,只有GetCurrentDir()是。
任何猜测,为什么代码不是为TestBuffer生成的,所以链接器可以find它?
PS这是一个人为的例子来演示问题,而不是实际的生产代码。
编译器将wideCharBuffer
的声明wideCharBuffer
是一个函数声明( 最令人烦恼的解析 )。 尝试将其更改为:
Test::TestBuffer<wchar_t> wideCharBuffer((size_t(dwRequiredSize)));