یوسف زالی
دوشنبه 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:
با این برنامه می تونید لیستی از میوتکس های رجیستر شده به همراه کلی اطلاعات باارزش دیگه، از جمله درایور ها و سشن ها رو داشته باشید.
با احترام -
همون طور که می دونید با استفاده از 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:
با این برنامه می تونید لیستی از میوتکس های رجیستر شده به همراه کلی اطلاعات باارزش دیگه، از جمله درایور ها و سشن ها رو داشته باشید.
با احترام -