1

このサイトの指示に従おうとしています: 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 の export ステートメントと共にすべてが定義されているため、リンカが定義を見つけられない理由がわかりません。また、この例では、TestBuffer の明示的なインスタンス化をエクスポートする必要さえありません。これは、DLL インターフェイスで公開されていないためです。GetCurrentDir() のみが公開されています。

リンカがコードを見つけられるように TestBuffer 用にコードが生成されていない理由について何か推測はありますか?

PSこれは、実際の製品コードではなく、問題を示すための不自然な例です。

4

1 に答える 1

5

コンパイラは、 の宣言をwideCharBuffer関数宣言として認識します (最も厄介な parse )。次のように変更してみてください。

Test::TestBuffer<wchar_t> wideCharBuffer((size_t(dwRequiredSize)));
于 2012-10-30T19:30:55.810 に答える