Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.29;
Скачать: CL | DM;

Вниз

Почему Мьютекс срабатывает на другую программу?   Найти похожие ветки 

 
Aleksandr ©   (2003-12-24 13:29) [0]

У меня во всех программах при запуске идет проверка на то, что программа уже была запущена. И вот с одной из них происходит казус. Если запущена программа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-24 14:21) [1]

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

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


 
Digitman ©   (2003-12-24 15:46) [2]

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


 
Aleksandr ©   (2003-12-24 20:59) [3]

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-25 09:37) [4]


> Aleksandr


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



Страницы: 1 вся ветка

Текущий архив: 2004.02.29;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.02 c
14-94102
VAleksey
2004-02-09 16:32
2004.02.29
Запреты.


1-93980
Biji
2004-02-17 12:42
2004.02.29
Что за фича с FileListBox?


1-93901
able
2004-02-15 11:48
2004.02.29
Пароли...


14-94133
Кукушкинд
2004-02-09 08:49
2004.02.29
Халявная музыка (anathema)


1-93882
atmospheric
2004-02-16 11:36
2004.02.29
public для function