غير المباشرة Typelib لا المستوردة من تصحيح أخطاء dll

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

سؤال

باستخدام VC2005 لدي 3 مشاريع لبناء:

  • libA (يحتوي على عناصر النتائج في libA.dll):IDL لديها خط library libA { ...
  • libB (يحتوي على عناصر استيراد libA النتائج في libB.dll):IDL لديها خط importlib( "libA " );
  • libC (الواردات libB):واحد من الملفات المصدر يحتوي على #import <libB.dll>

على #import <libB.dll> هو التعامل معها من قبل المترجم بالطريقة التالية (وفقا الوثائق):

  1. البحث الدلائل من مسار ٪ ٪
  2. البحث الدلائل %LIB%
  3. البحث في "إضافية تشمل مسارات" (/I الخيار برنامج التحويل البرمجي)

عند ترجمة libC ، أستطيع أن أرى ذلك cl.exe واضح هي قادرة على العثور على libA.dll على المسار القابل للتنفيذ (باستخدام Filemon.exe)

VC خطأ C4772:#الاستيراد من typelib مع تبعية أخرى

ومع ذلك ، لا تزال libA مساحة لا العثور على جميع الإشارات إلى libA أنواع محلها __missing_type__

(تحرير) وفي الوقت نفسه ، اكتشفت المشكلة تظهر فقط عند استخدام التصحيح dlls.

هل رأى أحدكم هذه المشكلة من قبل ؟ و حلها ؟

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

المحلول 4

وجدت أخيرا!

في مشروع Visual Studio ، أ. idl الملف في LibA كان MkTypeLib متوافق الإعداد.هذا مرفوض السلوك الموروثة من المشروع.لجعل الأمور أسوأ, كان فقط في تكوين التصحيح.

وكانت النتيجة أن كل

typedef [public] tagE enum { cE1, cE2 } eE;

هذا أدى إلى tagE لم يتم تعريف في الناتج typelib.عندما LibB هل هو import( "A.dll" ), كافة المراجع إلى tagE تم استبدال مع __missing_type__...

نصائح أخرى

أنت صراحة إعداد المشروع تبعيات?وبعبارة أخرى هل إعداد الحل في IDE لذلك هذا المشروع ج يعتمد على المشروع ب ، ب يعتمد على المشروع ؟

يمكنك استخدام أنواع محددة في libA من libC?إذا كنت تعتقد أنك بحاجة إلى مباشرة استيراد libA من libC بحيث يعرف عن libA أنواع.COM لا تلقائيا إشارة نوع المكتبات التي هي في حد ذاتها المشار إليها من جانب آخر مكتبة نوع.

ليس لدي جواب لك, لكن هذه التجربة عدة مرات و أود أن أطلعكم على ما فعلت.

على عدة مشاريع لا علاقة لها كان لدي نفس السيناريو.حاولت منذ ما يقرب من أسبوع في حالة واحدة لحل تبعيات لكنني في نهاية المطاف إلى خفض الخسائر من أجل البقاء في الموعد المحدد.انتهى بي الأمر باستخدام #تشمل على .tlh الملف (تنفيذ الواردات على DLL سوف تولد هذه) ، ثم استخدام "الكلاسيكية com" مكالمات api للحصول على مؤشرات على هياكل داخل .tlh الملفات.المدونة ليست نظيفة للعمل مع كما أنه سيكون إذا كنت يمكن استخدام المجمع الملفات ، لكنه يعمل.

IUnknown *lpUnk;
hr = CoCreateInstance(clsID, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)&lpUnk);
if (FAILED(hr)) throw SomeException;  

                                          //
_Application *app;                        //Address _Application  
hr = lpUnk->QueryInterface(__uuidof(_Application), (void **) &app);
lpUnk->Release();
if (FAILED(hr)) throw SomeException;  

                                          // Do stuff with the app object  
app->Release();                           // Then release

يمكنك إلى حد ما "دي-قبح" هذا باستخدام CComPtr المجمع قالب للقيام الإفراج موثوق من مع المدمر عندما يخرج من نطاق:

CComPtr<IUnknown> lpUnk;
hr = CoCreateInstance(clsID, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)lpUnk);
if (FAILED(hr)) throw SomeException;  
                                          //
CComPtr<_Application> app;                //Address _Application  
hr = lpUnk->QueryInterface(__uuidof(_Application), (void **) &app);
if (FAILED(hr)) throw SomeException;
                                         //
                                         // Do stuff with the app object

علما بأن _Application مؤشر مثال على استخدام أحد الهياكل من .tlh الملف.

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