لماذا لا يمكنني استخدام __declspec (dllexport) لتصدير dllgetClassObject () من com dll؟

StackOverflow https://stackoverflow.com/questions/3460533

  •  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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top