Предлагаю добавить эти функции в System.
interface
......................................
const
MAX_PARAMS = 128;
type
TArgValues = array[0..MAX_PARAMS - 1] of PAnsiChar;
var
ArgCount: LongInt = 1; // at least program path
ArgValues: TArgValues;
function ParamCount: LongInt;
function ParamStr(Idx: LongInt): PAnsiChar;
......................................
implementation
......................................
function ParamCount: LongInt;
begin
if ArgCount > 1 then
Result := ArgCount - 1
else
Result := 0;
end;
function ParamStr(Idx: LongInt): PAnsiChar;
begin
if Idx < ArgCount then
Result := ArgValues[Idx]
else
Result := '';
end;
procedure ProcessArgs;
asm
PUSH EBX
PUSH ESI
PUSH EDI
MOV ESI, CmdLine
LEA EDI, ArgValues
MOV EAX, AppPath
MOV [EDI], EAX
ADD EDI, 4
XOR EBX, EBX
XOR ECX, ECX
@next:
MOV CL, [ESI]
JECXZ @done
INC ESI
CMP CL, ' '
JE @next
MOV AL, '"'
INC EBX
CMP AL, CL
MOV EDX, ESI
JE @quote
DEC EDX
MOV AL, ' '
@quote:
MOV [EDI], EDX
@parse:
MOV CL, [ESI]
JECXZ @done
INC ESI
CMP AL, CL
JNE @parse
ADD EDI, 4
MOV BYTE PTR [ESI - 1], 0
JMP @next
@done:
ADD ArgCount, EBX // ArgCount already contains at least 1
POP EDI
POP ESI
POP EBX
end;
......................................
initialization
......................................
AppPath := PPKolibriChar(32)^;
CmdLine := PPKolibriChar(28)^;
ProcessArgs;
а также тестовый пример
program ParamTest;
{$APPTYPE CONSOLE}
uses
CRT;
var
i: LongInt;
begin
WriteLn('ParamCount = ', ParamCount);
for i := 0 to ParamCount do
WriteLn('ParamStr(', i, ') = ', ParamStr(i));
end.
Кстати, есть такое предложение: держать эти функции не в System, а в отдельном модуле и подключать их только по необходимости(по аналогии с менеджером памяти).
Ведь не все программы принимают параметры в командной строке, а для файлового пути к самой программе у нас есть AppPath.