لماذا لا يمكنني استخدام __declspec (dllexport) لتصدير dllgetClassObject () من com dll؟
-
27-09-2019 - |
سؤال
أقوم بتطوير 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 يجب أن تصدير أساليبهم باستخدام أ ديف ملف؟
تحديث 1
لقد اختبرت إعلاني باسم طريقة مختلفة ، كما هو موضح أدناه:
extern "C" HRESULT __declspec(dllexport) __stdcall f()
{
return S_OK;
}
وتم تصدير هذه الطريقة بنجاح. لذلك يمكن استخدام هذه المحددات معًا. يبدو أن برنامج التحويل البرمجي C ++ المرئي Stdapi و extern "C" hresult __declspec (dllexport) __stdcall غير متوافق.
المحلول
تحدث هذه المشكلة على ما أعتقد لأن وظيفة __stdcall (للبناء 32 بت) مزين عادة ببادئة سطحية و @count
postfix. ولكن إذا تم تمييز الوظيفة أيضًا __declspec(dllexport)
تتم إضافة زينة إضافية (__imp
, ، أظن).
قد تكون قادرًا على تجنب استخدام ملف .def مع pragma التالي ، إذا كنت على استعداد للعيش مع pragma (أعتقد أنني سأذهب إلى ملف .def):
#pragma comment( linker, "/export:DllGetClassObject=_DllGetClassObject@12" )
لاحظ أنه بالنسبة لبنية X64 ، قد تضطر إلى تجميع البراغما بشكل مشروط ، والتي أعتقد أنها ستكون:
#pragma comment( linker, "/export:DllGetClassObject" )
نصائح أخرى
لا يتم تجميع ذلك لأن الإعلان الأصلي في OBJBase.h لم يكن لديه سمة __declspec (dllexport). لا يمكنك إضافته في التعريف. لن يساعد على أي حال ، زخرفة الاسم غير مناسبة. أوضح لك مايكل ما يجب فعله حيال ذلك.
سأخرج على أحد الأطراف وأقول نعم.
حتى Visual Studio 2008 يقوم تلقائيًا بإنشاء ملف .DEF لمشاريع ATL COM .DLL.