Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему Мьютекс срабатывает на другую программу? [D7, WinXP]


Aleksandr ©   (2003-12-24 13:29:00) 

У меня во всех программах при запуске идет проверка на то, что программа уже была запущена. И вот с одной из них происходит казус. Если запущена программа1, в которой проверка выглядит так:

// dpr


var
XHM: THandle;

function CheckExists: boolean;
begin
XHM := OpenMutex(MUTEX_ALL_ACCESS, false, "ATT3Mutex");
Result := (XHM <> 0);
if XHM=0 then
XHM := CreateMutex(nil, false, "ATT3Mutex");
end;

begin
if CheckExists then begin
RiMessage(Application.Handle,h_Information,h_ProgramAlreadyRun);
Exit
end;
try
Application.Initialize;
...
finally
CloseHandle(XHM)
end
end.


то при попытке запустить программу2, в которой проверка выглядит вот так:


var
_HMRS: THandle;

function CheckExists: boolean;
begin
_HMRS:=OpenMutex(MUTEX_ALL_ACCESS, false, "ATBASE_Mutex");
Result:=(_HMRS<>0);
if NOT Result then
CreateMutex(nil, false, "ATBASE_Mutex")
end;

begin
if CheckExists then begin
RIMessage(Application.Handle," Уведомление ","Программа уже запущена!"#13#10^M"Повторный запуск отменен.");
Exit
end;
try
Application.Initialize;
...
finally
CloseHandle(_HMRS)
end
end.


эта самая программа2 выгружается безо всяких сообщений, а на передний фон виндов вылезает программа1. При этом в обратном порядке (программа2, затем программа1) все нормально.

В чем тут может быть причина, если названия Мьютексов разные, названия файлов и заголовки - тоже?


Digitman   (2003-12-25 09:37:00) [1]


> Aleksandr


ну ты попробовал мой вариант [2] ?


Aleksandr   (2003-12-24 20:59:00) [2]

RiMessage - это надстройка над стандартной MessageBox:


function RiMessage(aHandle : HWND; aCaption, aText : string; const aButtons : word=MB_OK) : word;
var
M : word;
begin
M:=aButtons;
if ANSISameText(aCaption,h_ConfirmationRus) OR ANSISameText(aCaption,h_ConfirmationEnu) then
M:=M OR MB_ICONQUESTION
else if ANSISameText(aCaption,h_ErrorRus) OR ANSISameText(aCaption,h_ErrorEnu) then
M:=M OR MB_ICONERROR
else if ANSISameText(aCaption,h_WarningRus) OR ANSISameText(aCaption,h_WarningEnu) then
M:=M OR MB_ICONWARNING
else if ANSISameText(aCaption,h_InformationRus) OR ANSISameText(aCaption,h_InformationEnu) then
M:=M OR MB_ICONINFORMATION
else
M:=M OR MB_ICONASTERISK;
if aHandle=0 then
M:=M OR MB_SYSTEMMODAL;
Result:=MessageBoxEx(aHandle,PChar(aText),PChar(aCaption),M OR MB_DEFBUTTON1 OR MB_APPLMODAL OR MB_TOPMOST, LANG_RUSSIAN)
end;


Digitman   (2003-12-24 15:46:00) [3]

function CheckExists: boolean;
begin
hMutex := CreateMutex(nil, false, "ATBASE_Mutex");
Result := GetLastError = ERROR_ALREADY_EXISTS;
end;


Digitman   (2003-12-24 14:21:00) [4]

попробуй-ка в программе 2 на время заменить вызов RIMessage() на банальный MessageBox(0, "", "", mb_ok)

если ситуация изменилась в сторону ожидаемой, то проблема - в неизвестно чем, называемом в дан.примере RIMessage()


Наверх

Титульная страница Поиск, карта сайта Написать письмо