【发布时间】:2011-03-28 11:52:06
【问题描述】:
我正在开发一个 COM dll 并尝试使用 __declspec(dllexport) 导出 DllGetClassObject() 方法。
这是我的声明:
extern "C" HRESULT __declspec(dllexport) __stdcall DllGetClassObject(REFCLSID rclsid,
REFIID riid, void** ppv)
但我一直收到此错误:
error C2375: 'DllGetClassObject' : redefinition; different linkage
所以我尝试检查所有出现的 DllGetClassObject 定义。于是在ObjBase.h中找到了如下一个。
STDAPI DllGetClassObject(__in REFCLSID rclsid, __in REFIID riid, __deref_out LPVOID FAR* ppv);
STDAPI 原来是这样的:
#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
换句话说,是这样的:
#define STDAPI extern "C" HRESULT __stdcall
根据MSDN:
要导出函数, __declspec(dllexport) 关键字必须出现在 调用约定关键字,如果是 已指定关键字。
但我之前提到的声明不起作用。
那么 COM DLL 必须用 def 文件导出它们的方法吗?
更新 1
我用不同的方法名测试了我的声明,如下所示:
extern "C" HRESULT __declspec(dllexport) __stdcall f()
{
return S_OK;
}
并且此方法已成功导出。所以这些说明符可以一起使用。似乎 Visual C++ 编译器认为 STDAPI 和 extern "C" HRESULT __declspec(dllexport) __stdcall 不兼容。
【问题讨论】:
-
你试过只使用宏吗? IE。
__declspec(dllexport) STDAPI DllGetClassObject(...); -
感谢您的回复。我试过了。现在没有编译错误。但也没有出口。我仔细检查了 DLL Exports Viewer 和 dumpbin.exe。这是一个两难的境地。这是微软最讨厌的错误之一吗?
标签: c++ com name-decoration