غير المباشرة Typelib لا المستوردة من تصحيح أخطاء dll
-
02-07-2019 - |
سؤال
باستخدام VC2005 لدي 3 مشاريع لبناء:
- libA (يحتوي على عناصر النتائج في libA.dll):IDL لديها خط
library libA { ...
- libB (يحتوي على عناصر استيراد libA النتائج في libB.dll):IDL لديها خط
importlib( "libA " );
- libC (الواردات libB):واحد من الملفات المصدر يحتوي على
#import <libB.dll>
على #import <libB.dll>
هو التعامل معها من قبل المترجم بالطريقة التالية (وفقا الوثائق):
- البحث الدلائل من مسار ٪ ٪
- البحث الدلائل %LIB%
- البحث في "إضافية تشمل مسارات" (/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 الملف.