![]() |
Re: QueryServiceConfig2 (PointerProb)
Ich habe es noch etwas schöner gemacht:
Delphi-Quellcode:
Allerdings kann ich es nicht testen, da bei mir der Fehler
program Project2;
{$APPTYPE CONSOLE} uses Windows, WinSvc; type SERVICE_DESCRIPTION = packed record lpDescription: PWChar; end; PSERVICE_DESCRIPTION = ^SERVICE_DESCRIPTION; function QueryServiceConfig2(hService: THandle; dwInfoLevel: DWORD; lpBuffer: Pointer; cbBufSize: DWORD; var pcbBytesNeeded: DWORD): LongBool; stdcall; external 'advapi32.dll' name 'QueryServiceConfig2W'; //////////////////////////////////////////////////////////////////////////////// // Procedure : SysErrorMessage // Comment : Returns last error as formated string function SysErrorMessage(ErrorCode: Integer): string; var Len : Integer; Buffer : array[0..255] of Char; begin Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer, SizeOf(Buffer), nil); while (Len > 0) and (Buffer[Len - 1] in [#0..#32, '.']) do Dec(Len); SetString(Result, Buffer, Len); end; function GetServiceDesciption(Computer, Servicename: PWChar; var Description: WideString): Boolean; var sc : THandle; os : THandle; sd : Boolean; dwNeeded : DWORD; Buffer : Pointer; begin dwNeeded := 0; Buffer := nil; sc := OpenSCManagerW(Computer, nil, SC_MANAGER_CONNECT); if sc <> 0 then begin os := OpenServiceW(sc, Servicename, SERVICE_QUERY_CONFIG); if os <> 0 then begin sd := QueryServiceConfig2(os, 1, nil, 0, dwNeeded); if (not sd) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin try GetMem(Buffer, dwNeeded); result := QueryServiceConfig2(os, 1, Buffer, dwNeeded, dwNeeded); if result then begin Description := PSERVICE_DESCRIPTION(Buffer)^.lpDescription; end; finally FreeMem(Buffer, dwNeeded); end; end else result := False; end else result := False; end else result := False; end; var description : WideString; begin if not GetServiceDesciption('hal9000', 'NetLogon', description) then begin Writeln(SysErrorMessage(GetLastError)); Readln; end else MessageBoxW(0, PWideChar(description), 'Dienstbeschreibung', 0); end. Zitat:
|
Re: QueryServiceConfig2 (PointerProb)
Nachtrag: Sein Hauptproblem war übrigens, dass er seine API-Funktion nicht als stdcall deklariert hat. Der Rest ist reine Geschmackssache.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr. |
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