الأم VC++ باستخدام الخارجية (غير المشروع) dll الإشارة كيفية تحديد مسار dll

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

سؤال

لدي الأم VC++ مشروع يستخدم dll (التي ليست في المشروع).الآن يجب وضع dll في واحد "مسار البحث المستخدمة من قبل Windows لتحديد موقع DLL" الرابط

ولكن أنا لا أريد dll الجلوس في exectuable أو الحالية أو ويندوز أو نظام الدليل.

لذا الخيار الوحيد ووفقا هو إضافة المسار إلى مسار ٪ ٪ متغير البيئة.

هل هناك أي طريقة أخرى ؟

هل هناك طريقة ذكية للقيام بذلك (إضافة إلى المسار)?يجب أن أفعل هذا على التثبيت ؟ يجب أن أقلق إذا أنا أفعل هذا ؟

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

المحلول

تلخيص جميع تقنيات وجدت:

  • إذا كنت تستخدم نجح المشروع بدء المشروع (الذي هو في الواقع حالتي) استخدام بيئة الصف

سلسلة temp = "myFullDirectoryPathToDll";سلسلة temp2 =البيئة.GetEnvironmentVariable("مسار") + ";" + درجة الحرارة ؛ البيئة.SetEnvironmentVariable("PATH", temp2);

هذا و أعتقد MSDN يجب التشديد على أن التغيرات في متغير بيئة PATH فقط في هذه العملية.

عند تصحيح الأخطاء في مقابل appPath لا 'العمل' استخدام خصائص->debug->البيئة ودمج متغيرات البيئة الرابط

  • إذا كنت تستخدم الأم:هل صريحة ربط يبدو كبير عمل شيء بسيط ، ربما استخدام appPath registery مفتاح على النشر الرابط, لا أحد قد تم اختبارها أثبتت الإجابة

نصائح أخرى

وإليك بعض الاقتراحات:

  • يمكنك تضمين dll كمورد في الرئيسية للتنفيذ ومن ثم استخراج إلى دليل مؤقت وتحميله من استخدام LoadLibrary ومن ثم الحصول على وظيفة ذات الصلة عناوين باستخدام GetProcAddress.

  • هل يمكن تعديل كنت العمليات الرئيسية مسار البحث باستخدام SetDllDirectory() تشمل موقع DLL.هذا يتجنب الحاجة إلى إجراء أي تغييرات على النظام.و مرة أخرى استخدام LoadLibrary/GetProcAddress لحل وظيفة عناوين.

إذا كنت تعرف أين من المرجح أن يكون موجودا في DLL، هل يمكن أن محاولة تحميله في وقت التشغيل باستخدام LoadLibrary () ثم استخدام GetProcAddress () لربط وظائف تحتاج إلى استدعاء.

ولن أكون سعيدا إذا أضيف تطبيق تثبيت الاشياء عشوائي لبلدي PATH العالمي. كما يؤثر هذا كل التطبيقات وقد الجانبية السيئة تؤثر.

وما شاهدته به هو وجود سيناريو بداية.
السيناريو يبدو ويتصرف مثل تطبيق للمستخدم (هكذا كنت لا تزال مزدوجة على مدار الساعة هو). ولكن السيناريو تعيين المسار المناسب ثم تطلق تطبيق حقيقي.

إذا كنت تستخدم DelayLoad، ثم قبل استدعاء أي وظيفة من شأنها أن تتسبب في دلل على تحميل، استدعاء LoadLibrary. هذا سوف "رئيس" تطبيق وأنها لن تذهب البحث عنه. لا حاجة لGetProcAddress

إذا كنت إطلاق من اختصار ويندوز، يمكنك تحديد مسار DLL في "البدء في" الموقع، مع تحديد الاسم الكامل للإكس والمسار في موقع "الهدف".

وإذا كان هناك دلس في دليل إكس بأن هناك حاجة، ويندوز <م> يجب تكون قادرة العثور عليها أيضا، لأنني أعتقد أن ترتيب البحث ويندوز DLL يبدو في مسار إكس لأول مرة (ل الدليل الحالي هو الخامس على لائحة).

ولقد استعملت طريقة فشل LoadLibrary / GetProcAddress مرات عديدة، ومحاولة لتجنب ذلك، كما هو الحال يترتب عليه قليلا من العمل الإضافي - الكثير من typedefs وtypecasts

وطريقة تحميل تأخير يعمل على دليل العمل في الوقت الذي تقرر استدعاء LoadLibrary. يمكنك استخدام هذا لصالحك. انظر http://msdn.microsoft.com/en- لنا / مكتبة / ms682586 (VS.85) .aspx اتصال للحصول على تفاصيل حول ترتيب مسار البحث.

وحاولت أن تعيين مسار التطبيق في سجل النظام. وهي تعمل بشكل جيد فقط عندما يكون المستخدم الحق في الوصول رجديت. وأيضا تعديل PATH متغير البيئة. اختباري المستخدم ليس لديه حق مشرف لتعديل متغير.

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