PDA

View Full Version : فرق این دو تابع چیه؟



شبیر کریمی
سه شنبه 25 اسفند 1388, 23:07 عصر
سلام
این دو تابع چه فرقی میکنن؟

GetModuleHandle

loadlibrary

mehdi.mousavi
سه شنبه 25 اسفند 1388, 23:20 عصر
سلام این دو تابع چه فرقی میکنن؟ GetModuleHandle
loadlibrary


سلام.
LoadLibrary، ماژولی رو که می خواهید load کنید رو به address space پروسه فعلی map میکنه و اگر لازم بدونه (در واقع نگاه میکنه ببینه قبلا Map شده یا نه، که اگر شده باشه)، reference count رو یک دونه افزایش میده. Reference Count یک عدده که نشون میده وقتی FreeLibrary رو فراخوانی کردید، آیا باید تابع map شده از address space پروسه فعلی unmap بشه یا خیر. در واقع اگر این عدد صفر باشه، تابع مزبور unmap میشه.

اما GetModuleHandle اینطور نیست. این تابع، handle به ماژول map شده رو بدون اضافه کردن Reference Count بهتون برمیگردونه. در نتیجه، باید خودتون هنگام فراخوانی FreeLibrary هوشیار باشید که ناخواسته، DLL مورد نظر رو از تو address space بیرون نندازید.

اینجا یک توضیح خوب هم از دید Kernel (http://blogs.msdn.com/junfeng/archive/2005/03/18/398970.aspx) برای تفاوت این دو تابع داده شده که خوندنش خالی از لطف نیست.

موفق باشید.

شبیر کریمی
سه شنبه 25 اسفند 1388, 23:56 عصر
خب حالا فرض کنیم که از loadlibrary در حالتی استفاده کنیم که ماژول مورد نظر قبلا در فضای پروسه map شده باشه در این صورت دیگه refrence count برابر با صفر نیست. خب حالا چطور ماژول رو unmap کنیم؟
(با توجه به اینکه گفتید freelibrary در صورتی که refrence count صفر باشه unmap میکنه)
در واقع چطور مقدار refrencecount رو میشه به صفر رسوند؟

mehdi.mousavi
چهارشنبه 26 اسفند 1388, 00:06 صبح
MSDN این مساله رو توضیح میده:

The system maintains a per-process reference count on all loaded modules. Calling LoadLibrary increments the reference count. Calling the FreeLibrary (http://msdn.microsoft.com/en-us/library/ms683152%28VS.85%29.aspx) or FreeLibraryAndExitThread (http://msdn.microsoft.com/en-us/library/ms683153%28VS.85%29.aspx) function decrements the reference count. The system unloads a module when its reference count reaches zero or when the process terminates (regardless of the reference count).

در واقع، زوج Load و Free باید همواره به یک تعداد تکرار بشه. یعنی اگر دو بار LoadLibrary کرده اید، تا وقتی دو بار هم FreeLibrary نکنید (یا Process اتمام پیدا نکنه)، Module آزاد نمیشه.

موفق باشید.