ฉันกำลังพัฒนา 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) จะต้องปรากฏทางด้านซ้ายของคีย์เวิร์ด Calling-Convention หากมีการระบุคีย์เวิร์ด
แต่คำประกาศของฉันที่กล่าวถึงก่อนหน้านี้ไม่ได้ผล
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