編集
この問題を回避するために、ヘッダーファイル(の先頭)に以下を追加しました。
#ifdef GetMessage
#undef GetMessage
static inline BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
) {
#if UNICODE
return ::GetMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#else
return ::GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#endif
}
#endif
次のようなコードから(Visual Studio 2008を使用して)C++DLLを作成しています。
ヘッダーファイル:
#include <windows.h> // Edit: This is the culprit.
class __declspec(dllexport) TestBaseClass
{
protected:
char m_Message[512];
public:
TestBaseClass();
virtual char* GetMessage(void) = 0;
};
class __declspec(dllexport) TestDerivedClass : public TestBaseClass
{
public:
TestDerivedClass();
virtual char* GetMessage(void);
};
CPPファイル:
TestBaseClass::TestBaseClass()
{
}
TestDerivedClass::TestDerivedClass() : TestBaseClass()
{
}
char* TestDerivedClass::GetMessage(void)
{
sprintf(m_Message, "This is a Message");
return m_Message;
}
DLLをコンパイルしようとすると、リンカーエラーが発生します。
エラーLNK2001:未解決の外部シンボル "public:virtual char * __thiscall TestDerivedClass :: GetMessageA(void)"(?GetMessageA @ TestDerivedClass @@ UAEPADXZ)
「GetMessage」のすべてのインスタンスを別のインスタンス(「TestFunc」など)に変更しても、リンカーエラーは発生しません。
主な質問:関数名として「GetMessage」を使用できないのはなぜですか?
二次質問:リンカーエラーを解決し、現在定義されているように、クラスに「GetMessage」を保持する方法はありますか?