Mega Code Archive

 
Categories / Delphi / Examples
 

Fixing problem with long command line parameters

Title: Fixing problem with *long* command line parameters Question: Delphi 4/5 is limited to parameters totalling 4095 bytes before an exception is raised. As my application was in the Send To menu and needed lots of files to be 'sent' to it I had to overcome this. The following are the functions needed to do this. Answer: // the following functions fix the 4095 byte limit for command line parameter(s) function Fixed_GetParamStr(P: PChar; var Param: string): PChar; function StrLen(Str: PChar): Cardinal; assembler; asm MOV EDX,EDI MOV EDI,EAX MOV ECX,0FFFFFFFFH XOR AL,AL REPNE SCASB MOV EAX,0FFFFFFFEH SUB EAX,ECX MOV EDI,EDX end; type PCharArray = ^TCharArray; TCharArray = array[0..MaxInt-1] of Char; var BufLen, Len: Integer; Buffer: PCharArray; begin BufLen := StrLen(P); GetMem(Buffer, BufLen); while True do begin while (P[0] #0) and (P[0] if (P[0] = '"') and (P[1] = '"') then Inc(P, 2) else Break; end; Len := 0; while P[0] ' ' do if P[0] = '"' then begin Inc(P); while (P[0] #0) and (P[0] '"') do begin Buffer[Len] := P[0]; Inc(Len); Inc(P); end; if P[0] #0 then Inc(P); end else begin Buffer[Len] := P[0]; Inc(Len); Inc(P); end; SetString(Param, Buffer^, Len); Result := P; FreeMem(Buffer, BufLen); end; function Fixed_ParamCount: Integer; var P: PChar; S: string; begin P := Fixed_GetParamStr(GetCommandLine, S); Result := 0; while True do begin P := Fixed_GetParamStr(P, S); if S = '' then Break; Inc(Result); end; end; function Fixed_ParamStr(Index: Integer): string; var P: PChar; Buffer: array[0..260] of Char; begin if Index = 0 then SetString(Result, Buffer, GetModuleFileName(0, Buffer, SizeOf(Buffer))) else begin P := GetCommandLine; while True do begin P := Fixed_GetParamStr(P, Result); if (Index = 0) or (Result = '') then Break; Dec(Index); end; end; end;