![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ув. Доны подскажите понадобилось считать параметры командной [D7, XP]
JTAG © (2005-11-22 15:32:00)строки при запуске программы, разыскал в хелпе функцию 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 содержат одни и теже данные путь к моей проги , как правильно считьать параметры командной строки
GuAV (2005-11-29 01:45:00) [1]Кстати, gdaujk © (27.11.05 0:30) [7] - меня всё равно не устроило бы.
Код в
> aLines.Add(pArgs^);
- заранее неизвестный код пользователя или VCL, имеет право выбрасывать исключения, поэтому требуется освобождение в секции finally (for соотвественно в try).
GuAV (2005-11-29 01:41:00) [2]
> HeapFree(GetProcessHeap(), 0, ppArgv);
gdaujk © (27.11.05 0:53) [8]
Это может и так, но зачем использовать эту неочевидную конструкцию ? Так же можно освободить, например через LocalFree, но зачем ?
Если лень писать
> hMem := GlobalHandle(pTemp);
> GlobalFree(hMem);
, то можно воспользоваться GlobalFreePtr.
> можно и не освобождать.
Можно. Память всё равно будет освобождена при выходе - тогда от процесса ничего не останется. Если функция вызывается небольшое и фиксированное число раз, утечка памяти не повредит.
Однако, если функция, не освобожадающая выделенную память, вызывается часто (например при рисовании или в Applicаtion.Idle, утечка может привести к потере производительности и неверной работе приожений.
Следить за тем, какая функция освобождает память, а какая нет и применять их соответственно - не очень хорошая идея. Хорошая идея - освобождать всё, что выделенно, и, по возможности, делать это в месте выделения. Особенно это касается разделяемых между модулями или процессами ресурсами.
gdaujk (2005-11-27 00:53:00) [3]GuAV © (26.11.05 12:39) [5]
А у Рихтера написано, что можно и не освобождать. Или освобождать сл. образом
HeapFree(GetProcessHeap(), 0, ppArgv);
А как лучше освобожадать, [7] или [8] ?
PS: не умею работать с памятью :-(
gdaujk (2005-11-27 00:30:00) [4]Вот так наверное правильно:
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:11:00) [5]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 GlobalFreeor LocalFreefunction.
GuAV (2005-11-26 12:39:00) [6]gdaujk © (26.11.05 2:00) [4]
А освобождать pArgs кто будет ?
gdaujk (2005-11-26 02:00:00) [7]Для 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;
System (2005-11-26 00:48:00) [8]>>вроде заработало , ничего не делал , нигде ни правил только делфю пепрегрузил
чтобы точно работало попробуй:
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;
JTAG (2005-11-22 15:35:00) [9]вроде заработало , ничего не делал , нигде ни правил только делфю пепрегрузил
Tonich (2005-11-22 15:34:00) [10]
> путь к моей проги
содержиться только в
> paramstr(0);
а во всех остальных параметры