Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Ув. Доны подскажите понадобилось считать параметры командной   Найти похожие ветки 

 
JTAG   (2005-11-22 15:32) [0]

строки при запуске программы, разыскал в хелпе функцию ParamStr
в обработчик создания формы написал такой код

procedure TForm1.FormCreate(Sender: TObject);
var p0,p1:string;
begin
p0:=paramstr(0);
form1.Memo1.Lines.Append("p0="+p0+"  ");
p1:=paramstr(1);
form1.Memo1.Lines.Append("p1="+p1+"  ");
end;
В надежде что в переменных р1, р2 у меня будет параметры моей строки при запуске, но в переменные р1,р2 содержат одни и теже данные путь к моей проги , как правильно считьать параметры командной строки


 
Tonich ©   (2005-11-22 15:34) [1]


> путь к моей проги

содержиться только в  
> paramstr(0);

а во всех остальных параметры


 
JTAG   (2005-11-22 15:35) [2]

вроде заработало , ничего не делал , нигде ни правил только делфю пепрегрузил


 
System   (2005-11-26 00:48) [3]

>>вроде заработало , ничего не делал , нигде ни правил только делфю пепрегрузил

чтобы точно работало попробуй:

procedure TForm1.FormCreate(Sender: TObject);
var
path:string;
i:integer;
begin
if paramstr(1)<>"" then
begin
for i:=1 to paramcount do
path:=path+paramstr(i)+" ";
end;


 
gdaujk ©   (2005-11-26 02:00) [4]

Для Win2k:

function CommandLineToArgvW(lpCmdLine: LPCWSTR; var pNumArgs: Integer): PPWideChar; stdcall;

implementation

{$R *.dfm}

function CommandLineToArgvW; external "shell32.dll" name "CommandLineToArgvW";

{GetMeParamStr}

function gdaParamStr(aLines: TStrings): string;
var
 NumArgs, i: Integer;
 pArgs: PPWideChar;
begin
 pArgs := CommandLineToArgvW(GetCommandLineW, NumArgs);
 for i := 1 to NumArgs do
 begin
   aLines.Add(pArgs^);
   Inc(pArgs);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 gdaParamStr(Memo1.Lines);
end;


 
GuAV ©   (2005-11-26 12:39) [5]

gdaujk ©   (26.11.05 2:00) [4]

А освобождать pArgs кто будет ?


 
gdaujk ©   (2005-11-27 00:11) [6]

GuAV ©   (26.11.05 12:39) [5]

И точно, поспешишь - людей насмешишь...

Remarks

It is the caller"s responsibility to free the memory used by the argument list when it is no longer needed. To free the memory, use a single call to either the GlobalFree or LocalFree function.


 
gdaujk ©   (2005-11-27 00:30) [7]

Вот так наверное правильно:

function gdaParamStr(aLines: TStrings): string;
var
 NumArgs, i: Integer;
 pArgs: PPWideChar;
 pTemp: Pointer;
 hMem: HGLOBAL;
begin
 pArgs := CommandLineToArgvW(GetCommandLineW, NumArgs);
 pTemp := pArgs;
 for i := 1 to NumArgs do
 begin
   aLines.Add(pArgs^);
   Inc(pArgs);
 end;
 hMem := GlobalHandle(pTemp);
 GlobalFree(hMem);
end;


 
gdaujk ©   (2005-11-27 00:53) [8]

GuAV ©   (26.11.05 12:39) [5]

А у Рихтера написано, что можно и не освобождать. Или освобождать сл. образом

HeapFree(GetProcessHeap(), 0, ppArgv);

А как лучше освобожадать, [7] или [8] ?

PS: не умею работать с памятью :-(


 
GuAV ©   (2005-11-29 01:41) [9]


> HeapFree(GetProcessHeap(), 0, ppArgv);

gdaujk ©   (27.11.05 0:53) [8]
Это может и так, но зачем использовать эту неочевидную конструкцию ? Так же можно освободить, например через LocalFree, но зачем ?
Если лень писать

> hMem := GlobalHandle(pTemp);
>  GlobalFree(hMem);

, то можно воспользоваться GlobalFreePtr.


> можно и не освобождать.

Можно. Память всё равно будет освобождена при выходе - тогда от процесса ничего не останется. Если функция вызывается небольшое и фиксированное число раз, утечка памяти не повредит.
Однако, если функция, не освобожадающая выделенную память, вызывается часто (например при рисовании или в Applicаtion.Idle, утечка может привести к потере производительности и неверной работе приожений.
Следить за тем, какая функция освобождает память, а какая нет и применять их соответственно - не очень хорошая идея. Хорошая идея - освобождать всё, что выделенно, и, по возможности, делать это в месте выделения. Особенно это касается разделяемых между модулями или процессами ресурсами.


 
GuAV ©   (2005-11-29 01:45) [10]

Кстати, gdaujk ©   (27.11.05 0:30) [7] - меня всё равно не устроило бы.
Код в

> aLines.Add(pArgs^);

- заранее неизвестный код пользователя или VCL, имеет право выбрасывать исключения, поэтому требуется освобождение в секции finally (for соотвественно в try).



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
14-1132938352
Fl@sh
2005-11-25 20:05
2005.12.18
Приглашение в Украину!!


14-1132500496
Piter
2005-11-20 18:28
2005.12.18
Помогите, пожалуйста, опознать песенку...


2-1133604782
ALex2
2005-12-03 13:13
2005.12.18
Приложение


2-1133260791
nickmas
2005-11-29 13:39
2005.12.18
Компонент TabControl


1-1132823354
Wolferio
2005-11-24 12:09
2005.12.18
Команды печати