سؤال

لدي DLL مكتوب في C ++ وأريد قمع اسم المشاهير للحصول على عدد قليل من الأساليب المصدرة. الأساليب عالمية وليس أعضاء في أي فئة. هل هناك طريقة لتحقيق ذلك؟

راجع للشغل: أنا أستخدم VS2008.

هل كانت مفيدة؟

المحلول

"bradtgmurray" هو الصحيح، ولكن لمجمعات التحويل البرمجانية Visual C ++، تحتاج إلى تصدير وظيفتك بشكل صريح على أي حال. ولكن باستخدام ملف .def كما هو مقترح من قبل "سيرج - APPTranslator" هو الطريقة الخطأ للقيام بذلك.

ما هي الطريقة العالمية لتصدير الرموز على Visual C ++؟

باستخدام تعليمات DELLSPEC (DLLEXPORT / DLLIMPORPORT)، والتي تعمل في كلا من التعليمات البرمجية C و C ++، مزينة أو لا

لذلك، فإن الطريقة الصحيحة لتصدير الوظائف غير المعروفة في Visual C ++ هي الجمع بين الصادرات "C" المصنوعة، كما تم الرد عليها "Bradtgmurray"، وكلمة DLLIMPORT / DLLEXPORT الرئيسية.

مثال ؟

كمثال، قمت بإنشائه على Visual C ++ مشروع DLL فارغ، وكتب وظيفتين، واحد يطلق عليه CPP لأنه تم تزيينه، والآخر جيجا لأنه لم يكن كذلك. الرمز هو:

// Exported header
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif

// Decorated function export : ?myCppFunction@@YAHF@Z
MY_DLL_API int myCppFunction(short v) ;

// Undecorated function export : myCFunction
extern "C"
{
MY_DLL_API int myCFunction(short v) ;
} ;

أعتقد أنك تعرف بالفعل، ولكن من أجل الاكتمال، يجب تعريف الماكرو My_dll_api في DLL Makefile (أي VCProj)، ولكن ليس بواسطة مستخدمي DLL.

رمز C ++ سهل الكتابة، ولكن من أجل اكتمال، سأكتبه أدناه:

// Decorated function code
MY_DLL_API int myCppFunction(short v)
{
   return 42 * v ;
}

extern "C"
{

// Undecorated function code
MY_DLL_API int myCFunction(short v)
{
   return 42 * v ;
}

} ;

نصائح أخرى

تحيط تعريفات الوظيفة مع خارجية "C" {}

extern "C" {
    void foo() {}
}

يرى http://www.parashift.com/c+-faq-lite/mixing-C-and-cpp.html.

يمكنك تجنب جميع Manglings (C ++، CDECL، STDCALL، ...) للوظائف المصدرة باستخدام ملف .DEF مع قسم الصادرات. ما عليك سوى إنشاء ملف mydll.def وإضافته إلى مشروعك:

LIBRARY "MyDLL"
EXPORTS
  Foo
  Bar

في الواقع، الفرص هي المعالج إنشاء ملف DEF بالفعل بالفعل. عليك فقط ملء قسم الصادرات.

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