Displayname für Service



  • Hallo,
    habe einen Service mit Builder XE7 compiliert. Bei der Installation dieses Service wird aber leider der Displayname (Name des Services im Dienstemanager von Windows) nicht übernommen, welchen ich als Eigenschaft "displayname" unter XE7 im Objektmanager eingetragen habe. Es erscheint im Dienstemanager immer der Name des Objektes (Service1) anstatt Displayname. HAt jemand eine Ahnung, ob es sich um einen XE7-BUg handelt? Wie könnte ich den Displaynamen noch festlegen?
    Danke!



  • Hallo,
    ja das scheint ein Bug zu sein. es geht jedoch problemlos mit "ChangeServiceConfig". Das kannst du in dem Event "ServiceAfterInstall" benutzen. Allerdings ist dort die Eigenschaft "DisplayName" komischerweise NULL, deshalb habe ich diesen separat festgelegt.

    const char *cDisplayName = "Mein Dienst"; // <-- Hier deinen Dienstnamen eintragen
    SC_HANDLE handle = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
    
    	if (!handle)
    	{
    		ShowMessage("Fehler OpenSCManager: "+IntToStr((int)GetLastError()) );
    		return;
    	}
    
    	SC_HANDLE srvhandle = OpenService(handle,cServiceName,SC_MANAGER_ALL_ACCESS);
    
    	if (!srvhandle)
    	{
    		ShowMessage("Fehler OpenService Fehlercode:"+IntToStr((int)GetLastError()) );
    		return;
    	}
    
    	//Displaynamen ändern
    	if (!ChangeServiceConfig(srvhandle,         //Handle
    				 SERVICE_NO_CHANGE, //ServiceType
    				 SERVICE_NO_CHANGE, //StartType
    				 SERVICE_NO_CHANGE, //dwErrorControl
    				 NULL,		    //lpBinaryPathName
    				 NULL,		    //lpLoadOrderGroup
    				 NULL,              //lpdwTagId
    				 NULL,              //lpDependencies
    				 NULL,              //lpServiceStartName
    				 NULL,              //lpPassword
    				 cDisplayName       //lpDisplayName
    											  ))
    	{
    		ShowMessage("Fehler ChangeServiceConfig:"+IntToStr((int)GetLastError()) );
    	}
    


  • ja, Danke. Habe inzwischen auch eine einfache Lösung gefunden:
    Einfach folgenden Event nutzen:

    void __fastcall TService1::ServiceBeforeInstall(TService *Sender)
    {
       DisplayName = L"NameDesDienstes"; //Name des Dienstes setzen, der im Windows-
       //Dienstemanager angezeigt werden soll. Nötig, da die Eigenschaft DisplayName
       //von Service1 aus dem Objektinspektor nicht übernommen wird von Windows!
    }
    


  • Danke, das ist natürlich noch einfacher. 😉


Log in to reply