Форум: "WinAPI";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
ВнизПочему Мьютекс срабатывает на другую программу? Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.011 c