Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi shellexecute nach createmutex (https://www.delphipraxis.net/51651-shellexecute-nach-createmutex.html)

eyeless 16. Aug 2005 13:46


shellexecute nach createmutex
 
hallo,

ich habe eine routine, die per createmutex testet, ob ein programm läuft und wenn nicht, dann soll es gestartet werden:

Delphi-Quellcode:
const
  cMutexID = 'MoppleMapper';
var
  Mutex: THandle;
  HAPPLICATION: HWND;
begin

Mutex := CreateMutex(nil, True, cMutexID);
if (Mutex <> 0) and (GetLastError = 0) then
 begin
  WinExec(PChar(ExtractFilePath(Application.ExeName) + 'moppl_map.exe'), SW_SHOW);
  Mutex := CreateMutex(nil, True, cMutexID);
 end;


{HAPPLICATION := 0;
repeat
 HAPPLICATION := FindWindowEx(0,HAPPLICATION, 'TApplication', PChar('MoppleMapper'));
until HAPPLICATION <> Application.Handle;}

end;
wenn ich das jez ausführe und das programm lief schon, iss alles super, WENN das programm allerdings vorher noch nicht lief und ich die procedure ausführe, macht der cursor für ca. 5 sec nur einen auf sanduhr und dann gehts weiter.

warum? muss ich den mutex dann wieder löschen? wie?

haha, ok, hat sich erledigt, CloseHandle(mutex), was sonst ... sorry, kann gelöscht werden ..

mfg, eyeless

Olli 16. Aug 2005 14:08

Re: shellexecute nach createmutex
 
Der Mutex "stirbt" mit der letzten Referenz auf ihn. Sobald dein Programm beendet wird, ist der Mutex weg. Daher funktioniert es beim nächsten Mal den Mutex wieder zu erstellen.

Außerdem solltest du ShellExecute verwenden, nicht WinExec - NIE WinExec!

Olli 16. Aug 2005 20:11

Re: shellexecute nach createmutex
 
Erlärst du uns mal bitte, wieso CloseHandle das Problem gelöst hat? :shock:

Da du WinExec benutzt hast, könnte dies hier das Problem sein.
Zitat:

The WinExec function returns when the started process calls the GetMessage function or a time-out limit is reached. To avoid waiting for the time out delay, call the GetMessage function as soon as possible in any process started by a call to WinExec.
Wenn aber dein Ziel ist, daß (unter der Voraussetzung, daß nur dein Programm dieses andere Programm startet) dieses andere Programm nur einmal läuft, ist der obige Code IMO nicht sehr sinnvoll (abgesehen von WinExec). Denn dann solltest du warten, bis der Prozeß beendet wird und dann den Mutex killen ...

Irgendwie ist mir zu hoch, was du vorhast :|

eyeless 16. Aug 2005 20:24

Re: shellexecute nach createmutex
 
closeHandle hat mir insofern geholfen, dass der mutex irgendwie das ausführen von dem programm (per winexec UND shellexecute) verhindert hat. durch closehandle wird er nun gekillt, das programm erfolgreich mit winexec gestartet und ein neuer mutex, der das programm diesmal findet, erstellt.

ich denke jedenfalls, das es so ist, jedenfalls funzt es nun ...

mfg, eyeless


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz