Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Createmutex / Windows 7 / 64bit Problem (https://www.delphipraxis.net/143121-createmutex-windows-7-64bit-problem.html)

Fridolin Walther 10. Nov 2009 13:51

Re: Createmutex / Windows 7 / 64bit Problem
 
Ich frage mich ein wenig, wozu man da ein Mutex bemüht. Viel sauberer wäre es imho den Service Manager einfach zu fragen ob der Service läuft. Das ist nicht nur einfacher, sondern auch sicherer (es gibt nämlich einen Zeitraum in der der Mutex noch nicht existiert, Dein Service aber im Begriff ist zu starten):

Delphi-Quellcode:
uses winsvc;

function IsServiceRunning(serviceName : string) : Boolean;
var
  scmHandle : THandle;
  serviceHandle : THandle;
  serviceStatus : TServiceStatus;
begin
  Result := FALSE;
  scmHandle := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, GENERIC_READ);
  if scmHandle <> 0 then
    begin
      serviceHandle := OpenService(scmHandle, PChar(serviceName), SERVICE_QUERY_STATUS);
      if serviceHandle <> 0 then
        begin
          if QueryServiceStatus(serviceHandle, serviceStatus) then
            result := serviceStatus.dwCurrentState <> SERVICE_STOPPED;
          CloseServiceHandle(serviceHandle);
        end;
      CloseServiceHandle(scmHandle);
    end;
end;
Wenn Du wirklich ein Mutex nutzen magst, dann sollte es meiner Ansicht nach notwendig sein, den Mutex im globalen Namespace zu erstellen. Dazu musst Du Dir dann vorher entsprechende Rechte besorgen.

Mavarik 10. Nov 2009 14:05

Re: Createmutex / Windows 7 / 64bit Problem
 
Zitat:

Zitat von Fridolin Walther
Wenn Du wirklich ein Mutex nutzen magst, dann sollte es meiner Ansicht nach notwendig sein, den Mutex im globalen Namespace zu erstellen. Dazu musst Du Dir dann vorher entsprechende Rechte besorgen.

Danke für den Codesnipe ISServiceRunning... (Funktioniert)

Leider verschieb das "nur" das Problem, weil unter Win7 das gleiche Problem mit den Events habe...

Auch die Events haben unter Vista mit eingeschalteter UAC ohne den globalen Namespace funktioniert...

Mavarik :coder:

Dezipaitor 10. Nov 2009 14:19

Re: Createmutex / Windows 7 / 64bit Problem
 
Naja, man wartet ja eigentlich nicht auf den Dienst selbst, sondern auf irgendein Feature, welches er bereitstellt, z.B. Pipe.

Mavarik 10. Nov 2009 14:31

Re: Createmutex / Windows 7 / 64bit Problem
 
Zitat:

Zitat von Dezipaitor
Naja, man wartet ja eigentlich nicht auf den Dienst selbst, sondern auf irgendein Feature, welches er bereitstellt, z.B. Pipe.

Ja klar... Der Dienst stellt über ein CreateFileMapping... Ein Memory Block zur Verfügung...
Das ganze mit verschiedenen Threads die alle über Events-Handels synconisiert werden...
Aber das funktioniert nicht mehr und Win 7...

Wenn ich die gleichen Exe unter Vista laufen lassen - alles einwandfrei...

Habe mir auch gerade die Updates der API usw. geladen... Gleiches Problem...

Mavarik :gruebel:

Mavarik 11. Nov 2009 15:20

Re: Createmutex / Windows 7 / 64bit Problem
 
Hallo Christian!

Hast Du mal ein Stück source für "CreateGlobalPrivilege"...

Leider kann ich dazu nix finden..

Grüsse :gruebel:

Mavarik 11. Nov 2009 16:35

Re: Createmutex / Windows 7 / 64bit Problem
 
OK So funktioniert es...

Delphi-Quellcode:
var
   SecurityDesc: TSecurityDescriptor;
   SecurityAttr: TSecurityAttributes;
begin
  InitializeSecurityDescriptor(@SecurityDesc, SECURITY_DESCRIPTOR_REVISION);

  SetSecurityDescriptorDacl(@SecurityDesc, True, nil, False);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.lpSecurityDescriptor := @SecurityDesc;
  SecurityAttr.bInheritHandle := False;


  Geladen := CreateMutex(@SecurityAttr, false,pchar('Global\'+ServiceDa));
  error := GetLastError;

  if error = ERROR_ALREADY_EXISTS
Ich gehe davon aus, dass ich alle Mutex und Events mit dem Parameter aufrufen muss...
Werde ich mal testen...

Grüsse Mavarik :coder:

Dezipaitor 11. Nov 2009 18:22

Re: Createmutex / Windows 7 / 64bit Problem
 
Das Privileg heißt SE_CREATE_GLOBAL_NAME und wird mit AdjustTokenPrivilege oder JwEnablePrivilege von JWSCL aktiviert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr.
Seite 2 von 2     12   

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