编辑
为了解决这个问题,我在头文件(开头)中添加了以下内容:
#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
我正在从如下代码创建一个 C++ DLL(使用 Visual Studio 2008):
头文件:
#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:未解析的外部符号“公共:虚拟字符 * __thiscall TestDerivedClass::GetMessageA(void)”(?GetMessageA@TestDerivedClass@@UAEPADXZ)
如果我将“GetMessage”的每个实例更改为其他内容(例如“TestFunc”),我不会收到链接器错误。
主要问题:为什么我不能使用“GetMessage”作为我的函数名?
第二个问题:有没有办法解决链接器错误,并按照当前定义在我的班级中保留“GetMessage”?