كيفية الحصول على مقبض وحدة التعليمات البرمجية الخاصة بي؟[ينسخ]

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

  •  02-07-2019
  •  | 
  •  

سؤال

التكرار المحتمل:
كيف يمكنني الحصول على HMODULE للتعليمات البرمجية المنفذة حاليًا؟

أحاول العثور على مورد في الوحدة الخاصة بي.إذا كانت هذه الوحدة قابلة للتنفيذ، فهذا أمر تافه - GetModuleHandle(NULL) إرجاع مقبض الوحدة "الرئيسية".

ومع ذلك، فإن الوحدة الخاصة بي هي ملف DLL يتم تحميله بواسطة ملف تنفيذي آخر.لذا GetModuleHandle(NULL) سيعيد مقبض الوحدة النمطية إلى الملف القابل للتنفيذ، وهو ما ليس ما أريده بوضوح.

هل هناك أي طريقة لتحديد مقبض الوحدة النمطية للوحدة التي تحتوي على الكود قيد التشغيل حاليًا؟استخدام اسم DLL في مكالمة إلى GetModuleHandle() يبدو وكأنه اختراق بالنسبة لي (ولا يمكن صيانته بسهولة في حالة نقل الكود المعني إلى ملف DLL مختلف).

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

المحلول

قم بتخزين مقبض الوحدة بعيدًا عندما يتم إعطاؤه لك في DllMain ثم استخدمه لاحقًا عندما تحتاج إليه بالفعل.تقوم العديد من أطر العمل (مثل MFC) بذلك تلقائيًا.

نصائح أخرى

إذا كان DLL مرتبطًا بـ MFC، فهناك طريقة للحصول على مثيل DLL الذي تم فيه استدعاء بعض الوظائف:

void dll_function()
  {
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  HINSTANCE dll_instance = AfxGetInstanceHandle();
  }

كما تم ذكره بالفعل، يمكن القيام بذلك عن طريق حفظ مؤشر الوحدة النمطية الذي تم تمريره إلى وظيفة DllMain.

ولكن هناك أسباب أخرى تجعلك تحفظ المقبض.

على سبيل المثال، إذا قررت ربط الموارد بمكتبة الارتباط الحيوي (DLL) باستخدام رابط المورد، فستحتاج إلى مقبض الوحدة هذا للوصول إلى هذه الموارد عبر LoadResource وظيفة واجهة برمجة التطبيقات.

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