Avatar billede hr__hallandsen Nybegynder
22. november 2006 - 14:32 Der er 3 kommentarer og
1 løsning

Bøvl med mutex

Jeg har brugt en modificeret version af mutexkoden fra mit spørgsmål her [ http://www.eksperten.dk/spm/716755 ], men er nu løbet ind i problemer:

function JustOneTest : boolean;
var
  Title: Array[0..$100] of Char;
begin
    Title:='jowjow';
  Mutex:=CreateMutex(nil, False, Title);
  if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then
  begin
    MessageBox(0, 'Application is already running', 'jowjow', 48);
    halt;
  end;
end;

-----------------------------------------------------------------

Starter man programmet tredje gang får man endnu en meddelelse om, at programmet allerede kører. Kan man i stedet sætte fokus på den allerede eksisterende meddelse i stedet?

PS: Jeg har fjernet {$APPTYPE CONSOLE} for at få konsollen væk og lave en proces i stedet.
Avatar billede kroning Nybegynder
22. november 2006 - 16:00 #1
Hvad med at du lige før du kalder messageBox opretter endnu en mutex som du så fjerner igen efter messagebox. Du starter så med at checke om denne mutex findes og gør den det ved du at program nr. 2 er startet og viser en messagebox.
Avatar billede hr__hallandsen Nybegynder
22. november 2006 - 16:25 #2
Ja, men hvordan giver jeg så den messageBox, som allerede eksisterer fokus?
Avatar billede kroning Nybegynder
22. november 2006 - 17:45 #3
Det ved jeg ikke.
Avatar billede hr__hallandsen Nybegynder
02. december 2006 - 18:17 #4
Hej hr. Hallandsen

Hvad med dette?

Hilsen hr. Hallandsen

--------------------------------------------------------------------------------------

unit CheckPrevious;

interface

uses Windows, SysUtils, Forms;

function RestoreIfRunning: Boolean;

implementation

type
  PInstanceInfo = ^TInstanceInfo;
  TInstanceInfo = packed record
    FirstHandle: THandle;
    PreviousHandle: THandle;
    RunCounter: Integer;
  end;

var
  InstanceInfo: PInstanceInfo;
  MappingHandle: THandle;
  MappingName: string;
  RemoveMe: Boolean = True;


function RestoreIfRunning: Boolean;
begin
  Result := True;
  MappingName := StringReplace(ParamStr(0), '\', '', [rfReplaceAll, rfIgnoreCase]);
  MappingHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TInstanceInfo), PChar(MappingName));
  if MappingHandle = 0 then
    RaiseLastOSError
  else
  begin
    InstanceInfo := MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TInstanceInfo));
    if (GetLastError <> ERROR_ALREADY_EXISTS) or (not IsWindow(InstanceInfo^.FirstHandle)) then
    begin
      InstanceInfo^.FirstHandle := Application.Handle;
      if GetLastError <> ERROR_ALREADY_EXISTS then
      begin
        InstanceInfo^.PreviousHandle := Application.Handle;
        InstanceInfo^.RunCounter := 1;
      end
      else
        InstanceInfo^.RunCounter := 1 + InstanceInfo^.RunCounter;
      Result := False;
    end
    else //Already runing
    begin
      MappingHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MappingName));
      if MappingHandle <> 0 then
      begin
        InstanceInfo := MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TInstanceInfo));
        if InstanceInfo^.RunCounter > 1 then
        begin
          if IsIconic(InstanceInfo^.PreviousHandle) then
            ShowWindow(InstanceInfo^.PreviousHandle, SW_RESTORE);
          SetForegroundWindow(InstanceInfo^.PreviousHandle);
          RemoveMe := False;
          Halt;
        end
        else
        begin
          InstanceInfo^.PreviousHandle := Application.Handle;
          InstanceInfo^.RunCounter := 1 + InstanceInfo^.RunCounter;
        end;
      end;
    end;
  end;
end;

initialization

finalization

if RemoveMe then //Remove one instance
begin
  MappingHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MappingName));
  if MappingHandle <> 0 then
  begin
    InstanceInfo := MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TInstanceInfo));
    InstanceInfo^.RunCounter := -1 + InstanceInfo^.RunCounter;
  end
  else
    RaiseLastOSError;
end;

if Assigned(InstanceInfo) then
  UnmapViewOfFile(InstanceInfo);
if MappingHandle <> 0 then
  CloseHandle(MappingHandle);

end.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester