unit uCmdLineHelper; interface uses Windows, Classes, SysUtils; type TCommandLineHelper = class(TObject) private function GetNextParam(var CmdLine: PChar; Buffer: PChar; Len: PInteger): Boolean; function GetParamCount: Integer; function GetCommandLine: string; function GetParamStr(Index: Integer): String; function GetHasParam(Value: String): Boolean; public property ParamStr[Index: Integer]: String read GetParamStr; property ParamCount: Integer read GetParamCount; property CommandLine: String read GetCommandLine; property HasParam[Value: String]: Boolean read GetHasParam; end; implementation function TCommandLineHelper.GetCommandLine : string; begin result := Windows.GetCommandLine; end; function TCommandLineHelper.GetHasParam(Value: String): Boolean; var I: Integer; param: String; begin result := False; for I:= 1 to ParamCount do begin param := UpperCase(ParamStr[I]); Value := UpperCase(Value); result := ((param = Value) or (param = '/'+Value) or ('/'+param = Value) or (param = '\'+Value) or ('\'+param = Value) or (param = '-'+Value) or ('-'+param = Value) or (param = ':'+Value) or (':'+param = Value)); if result then Exit; end; end; function TCommandLineHelper.GetNextParam(var CmdLine: PChar; Buffer: PChar; Len: PInteger): Boolean; var InQuotedStr, IsOdd: Boolean; NumSlashes, NewLen, cnt: Integer; begin Result := False; if Len <> nil then Len^ := 0; if CmdLine = nil then Exit; while (CmdLine^ <= ' ') and (CmdLine^ <> #0) do CmdLine := CharNext(CmdLine) ; if CmdLine^ = #0 then Exit; InQuotedStr := False; NewLen := 0; repeat if CmdLine^ = '\' then begin NumSlashes := 0; repeat Inc(NumSlashes) ; CmdLine := CharNext(CmdLine) ; until CmdLine^ <> '\'; if CmdLine^ = '"' then begin IsOdd := (NumSlashes mod 2) <> 0; NumSlashes := NumSlashes div 2; Inc(NewLen, NumSlashes) ; if IsOdd then Inc(NewLen); if Buffer <> nil then begin for cnt := 0 to NumSlashes-1 do begin Buffer^ := '\'; Inc(Buffer) ; end; if IsOdd then begin Buffer^ := '"'; Inc(Buffer) ; end; end; if IsOdd then CmdLine := CharNext(CmdLine) ; end else begin Inc(NewLen, NumSlashes); if Buffer <> nil then begin for cnt := 0 to NumSlashes-1 do begin Buffer^ := '\'; Inc(Buffer) ; end; end; end; Continue; end; if CmdLine^ <> '"' then begin if (CmdLine^ <= ' ') and (not InQuotedStr) then Break; Inc(NewLen) ; if Buffer <> nil then begin Buffer^ := CmdLine^; Inc(Buffer) ; end; end else InQuotedStr := not InQuotedStr; CmdLine := CharNext(CmdLine) ; until CmdLine^ = #0; if Len <> nil then Len^ := NewLen; Result := True; end; function TCommandLineHelper.GetParamCount: Integer; var CmdLine: PChar; begin Result := 0; CmdLine := Windows.GetCommandLine; GetNextParam(CmdLine, nil, nil) ; while GetNextParam(CmdLine, nil, nil) do Inc(Result) ; end; function TCommandLineHelper.GetParamStr(Index: Integer): String; var Buffer: array[0..MAX_PATH] of Char; CmdLine, P: PChar; Len: Integer; begin Result := ''; if Index <= 0 then begin Len := GetModuleFileName(0, Buffer, MAX_PATH+1) ; SetString(Result, Buffer, Len) ; end else begin CmdLine := windows.GetCommandLine; GetNextParam(CmdLine, nil, nil) ; repeat Dec(Index) ; if Index = 0 then Break; if not GetNextParam(CmdLine, nil, nil) then Exit; until False; P := CmdLine; if GetNextParam(P, nil, @Len) then begin SetLength(Result, Len) ; GetNextParam(CmdLine, PChar(Result), nil) ; end; end; end; end.
Usage:
var idx : integer; helper: TCommandLineHelper; begin helper:= TCommandLineHelper.Create; with Memo1.Lines do begin Clear; Add('CMD Line: ' + helper.CommandLine + #13#10) ; Add('Number of params: ' + IntToStr(helper.ParamCount) + #13#10) ; for idx := 1 to helper.ParamCount do begin Memo1.Lines.Add(helper.ParamStr[idx]) ; end; Memo1.Lines.Add('Has Param - and ? '+ BoolToStr(helper.HasParam['third'], true)); end; helper.Free; end;
No comments:
Post a Comment