Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
ВнизУв. Доны подскажите понадобилось считать параметры командной Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.014 c