Я разрабатываю COM-библиотеку и пытаюсь экспортировать метод 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 как несовместимые.
__declspec(dllexport) STDAPI DllGetClassObject(...);
- person JSBձոգչ   schedule 11.08.2010