Я разрабатываю COM DLL и пытаюсь экспортировать метод DllGetClassObject () с помощью __ declspec (dllexport) .
Вот мое заявление:
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 как несовместимые.