SetServiceStatus



  • Hallo,

    ich möchte oben genannte Funktion in einem (mit .NET erstellten) Dienst verwenden. Problem dabei:

    Die struct SERVICE_STATUS aus C kann ich in meiner managed Klasse deklarieren. Schreibe ich mir schnell eine eigene managed struct des Ganzen funktioniert es auch nicht, weil SetServiceStatus dies als zweiten Parameter nicht akzeptieren will ...

    Jemand eine Idee / Lösung?

    [DllImport("ADVAPI32.DLL", EntryPoint = "SetServiceStatus")]
    extern bool SetServiceStatus( IntPtr hServiceStatus,
    						      SERVICE_STATUS lpServiceStatus );
    
    public ref struct SERVICE_STATUS
    {
    	int serviceType,
    	currentState,
    	controlsAccepted,
    	win32ExitCode,
    	serviceSpecificExitCode,
    	checkPoint,
    	waitHint;
    };
    


  • Warum rufst Du die Funktion nicht direkt (ohne P/Invoke [DllImport]) auf?
    In C++/CLI geht das. Anschliessend kannst Du wenn benötigt die native Struktur auf eine managed Struktur mappen.

    Simon



  • theta schrieb:

    Warum rufst Du die Funktion nicht direkt (ohne P/Invoke [DllImport]) auf?
    In C++/CLI geht das. Anschliessend kannst Du wenn benötigt die native Struktur auf eine managed Struktur mappen.
    Simon

    Weil ich dann die unmanaged struct SERVICE_STATUS verwenden muss. Wenn ich die in meiner Klasse deklariere, bekomme ich - folglich - die Meldung, dass gemischte Typen nicht erlaub seien.

    UPDATE:
    Okay hat sich erledigt, ich hab jetzt meine eigene ref struct verwendet und die Funktion nachgebildet ... umständlich aber erfolgreich.



  • Das Problem hast Du nur, wenn Du SERVICE_STATUS als Member eins managed Typen verwendest. Mach doch (finde ich sowiso sauberer) einen native Wrapper um das SERVICE_STATUS_HANDLE und benutze nachher diesen in deinem managed Wrapper.

    Simon


Log in to reply