ورود

View Full Version : چک کردن باز بودن نسخه ای از برنامه، معرفی یک برنامه برای مانیتورینگ Mutex های بانام



یوسف زالی
دوشنبه 18 فروردین 1393, 13:50 عصر
سلام.
همون طور که می دونید با استفاده از CreateMutex می تونید کاری کنید که برنامه فقط یک بار ران بشه، به این صورت که سعی می کنید یک میوتکس بسازید و در صورت شکست یعنی قبلا برنامه ران شده. اما اگر بدون اینکه بخواهید میوتکس بسازید، فقط چک کنید ببینید که میوتکس وجود داره یا نه، چاره کار OpenMutex هست.
اما این تابع یکم کارش نیاز به توضیح داره (بعد از کلی ور رفتن و زیر و رو کردن MSDN و مانیتور کردن میوتکس ها)
کار این تابع اینه که چک می کنه ببینه قبلا میوتکسی با نامی که بهش می دید وجود داره یا نه، اگر وجود نداشت صفر بر می گردونه اما اگر وجود داشت،
یک هندل جدید می سازه و به میوتکس مورد نظر اشاره می کنه و هندل رو بهتون می ده.
این یعنی این که هندلی که CreateMutex ساخته با این هندل جدید فرق داره. و این به این معنیه که دیگه CloseHandle کردنش باعث آزاد سازی Mutex نخواهد شد.
چاره کار چیه؟ چاره اینه که موقعی که دارید چک می کنید (با OpenMutex) هندل برگشت داده شده رو همونجا ببندید.
انجام ندادن همین کار کوچیک یکی از سرویس های من رو خوابونده بود.

نمونه کد برای چک کردن وجود یک میوتکس:

function MutexExists(MutexName: PAnsiChar): boolean;
var
h: THandle;
begin
Result := false;
try
h := OpenMutex(STANDARD_RIGHTS_REQUIRED, false, MutexName);
Result := h <> 0;
finally
try
CloseHandle(h);
except
end;
end;
end;




اما معرفی یک برنامه،
برنامه Winobj:
با این برنامه می تونید لیستی از میوتکس های رجیستر شده به همراه کلی اطلاعات باارزش دیگه، از جمله درایور ها و سشن ها رو داشته باشید.

با احترام -

Mask
دوشنبه 18 فروردین 1393, 15:41 عصر
حالا اگه بخواهیم هندل Mutex اصلی رو بگیریم و ببندیم، باید چه کنیم.

یوسف زالی
دوشنبه 18 فروردین 1393, 15:53 عصر
باید همون خروجی CreateMutex رو نگه داشته باشی :لبخند: و اون رو CloseHandle کنی.
در حقیقت میوتکس یکیه، فقط تعدادی هندل بهش اختصاص پیدا می کنه.
باید همه هندل ها بسته باشند تا میوتکس آزاد بشه.

Mask
سه شنبه 19 فروردین 1393, 13:25 عصر
باید همون خروجی CreateMutex رو نگه داشته باشی :لبخند: و اون رو CloseHandle کنی.
در حقیقت میوتکس یکیه، فقط تعدادی هندل بهش اختصاص پیدا می کنه.
باید همه هندل ها بسته باشند تا میوتکس آزاد بشه.
منظور هندل Mutex یه برنامه دیگست دادا.

hadisalahi2
پنج شنبه 21 فروردین 1393, 11:20 صبح
شرمنده یوسف جان
حالا اگه بخوایم همون اول میوتکس رو بسازیم که بعد چکش کنیم باید چه کنیم ؟
ببخشید ها ، ما یک کم سواتمون پایینه :لبخند:

Mask
پنج شنبه 21 فروردین 1393, 17:16 عصر
با اجازه ::خجالت:


شرمنده یوسف جان
حالا اگه بخوایم همون اول میوتکس رو بسازیم که بعد چکش کنیم باید چه کنیم ؟
ببخشید ها ، ما یک کم سواتمون پایینه
یه چیز تو این مایه ها میشه:

function SetMutex: boolean;var
H: Thandle;
begin
H := CreateMutex(nil, False, 'Sample');
result := False;
If not(WaitForSingleObject(H, 0) <> Wait_TimeOut) then
result := true;
end;

hadisalahi2
یک شنبه 24 فروردین 1393, 11:27 صبح
این Sample همون اسم برنامه هستش دیگه؟

یوسف زالی
یک شنبه 24 فروردین 1393, 11:35 صبح
نه. اصلا فرقی نمی کنه چی بدی. در حقیقت شما یک رشته یونیک رو رجیستر می کنی. این رشته برای اطمینان از این که یونیک باشه می تونه مثلا نام برنامه باشه. یا حتی می تونید GUID رو به فرم رشته ای ثبت کنید.
میوتکس تا خاموش شدن سیستم وجود داره مگر این که برنامه ای که اون رو درست کرده بسته بشه یا خودش ببندتش یا این که سایر برنامه ها میوتکس برنامه شما رو بزنن منهدم کنن!