سؤال

بالنظر إلى DLL مع الفصول التالية:

#define DLLAPI __declspec(...)

class DLLAPI Base
{
    public:
    virtual void B();
};

class Derived : public Base
{
    public:
    virtual void B();
    virtual void D();
};

هل سيتم رؤية فئة "المشتقة" في الخارج خارج DLL حتى إذا لم يتم تطبيق كلمة "dllapi" على تعريف الفصل (على الأقل، ليس مباشرة)؟

هي وظيفة "D ()" مرئية ل؟

شكرا

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

المحلول

لن يتم تصدير الفئة المستمدة بواسطة DLL. الفصول لا ترث التصدير. أضف dllapi إلى ذلك أيضا.

لاحظ أيضا أن أعضاء الفصل الافتراضي في إمكانية الوصول الخاصة، لذلك يجب أن يكون أي من أساليبك متاحة. ومع ذلك، فأنا أرى قاعدة :: ب () يتم تصديرها في اختباري. سيقوم رأس C ++ في التعليمات البرمجية DLL باستخدام الخطأ، لكنني أتساءل عما إذا قمت بتبديل الرأس هناك، إذا كنت قد تخدعه.

على أي حال، إذا قمت بإنشاء مثيل مشتق داخل DLL الخاص بك (عبر نقطة دخول أخرى)، يجب أن لا يزال الجدول الظاهري يعمل، لذلك إذا فعلت:

Base* b = getTheDerived(); b->B();

كنت تستدعي مشتق :: ب ().

نصائح أخرى

يمكنك معرفة ذلك من قذيفة أمر مرئي استوديو عن طريق الكتابة

link /dump /exports <yourdll>

إذا تم تصديرها، سترى "أسماء مزينة" للوظائف. لمعرفة ما هم في شكل بنسب قابل للقراءة، نسخ لصق واحد والقيام به

undname <decorated name>

لا، مشتقة لن يكون مرئيا خارج DLL. من أجل تصدير الفئة المشتقة، يجب عليك تطبيق ماكرو Dllapi على الفئات المشتقة أيضا.

عليك أن تجعل كل من القاعدة والفئات المشتقة قابلة للتصدير،

http://msdn.microsoft.com/en-us/library/81h27t8c.aspx.

All base classes of an exportable class must be exportable. If not, a compiler 
warning is generated.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top