![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование по списку [XP]
Steep © (2007-04-11 06:56:00)Есть список LB.Items в которым указаны пути к файлам
Пытаюсь копировать
-
5 - файлов - нормально
-
126 путей после 80 начинает писать 1799445615 (k)
-
1105 путей - даже сообщение не выводит
Project *** faulted with message 'access violation at 0x7c90eddc: write adress 0x00030ff8.'
Что за ошибки??
Вот код:
var
i, k, Col: cardinal;
Fo : TSHFileOpStruct;
buffer : array[0..4096] of char;
p : pchar;
begin
k :=0;
FillChar(Buffer, sizeof(Buffer), #0);
p := @buffer;
Col := LB.Count-1;
for i:=0 to Col do
begin
if FileExists( LB.Items.Strings[i] ) then
begin
p := StrECopy( p, PChar( LB.Items.Strings[i]) ) + 1;
inc(k);
Showmessage( 'путей: '+IntToStr(k) );
end;
end;
FillChar(Fo, sizeof(Fo), #0);
Fo.Wnd := Handle;
Fo.wFunc := FO_COPY;
Fo.pFrom := @Buffer;
Fo.pTo := PChar(LE_Folder.Text);
Fo.fFlags := 0;
if ((SHFileOperation(Fo) <> 0) or
(Fo.fAnyOperationsAborted <> false)) then
ShowMessage('Cancelled')
end;
Steep (2007-04-11 09:02:00) [1]
> Помни! последний элемент должен быть 2 нуля #0 т.е. #0#0
т.е. + 1 +1 или + #0 + #0 ??
SlymRO (2007-04-11 08:48:00) [2]Steep © (11.04.07 8:45) [8]
Помни! последний элемент должен быть 2 нуля #0 т.е. #0#0
Steep (2007-04-11 08:45:00) [3]Спасибо!
SlymRO (2007-04-11 07:44:00) [4]Steep © (11.04.07 7:13) [4]
а до скольки можно увеличить
До необходимого размера...
var buffer:PChar;
...
Size:=0;
for i:=0 to Col do
begin
if FileExists( LB.Items.Strings[i] ) then
Size:=Size+Length(LB.Items.Strings[i])+1;
end;
GetMem(buffer,Size);
try
...
Finally
FreeMem(buffer);
end;
Steep (2007-04-11 07:30:00) [5]А в буфер можно записать 51200000?
MBo (2007-04-11 07:18:00) [6]>Убрать можно?
Нет. Строки должны разделяться нулями, вот для нуля место и оставляется, насколько я понимаю
Steep (2007-04-11 07:13:00) [7]
> А понял. 80 путей - это как раз примерно 4кб и занимает.
> А дальше ты залезаешь, куда нельзя.
т.е. просто увеличить буфер? а до скольки можно увеличить?
> А плюс один тут зачем? Ты ж увеличиваешь указатель и постепенно
> выходишь за границы массива buffer, а туда нельзя.
Незнаю так в примере было. Убрать можно?
TUser (2007-04-11 07:09:00) [8]А понял. 80 путей - это как раз примерно 4кб и занимает. А дальше ты залезаешь, куда нельзя.
TUser (2007-04-11 07:06:00) [9]
> p := StrECopy( p, PChar( LB.Items.Strings[i]) ) + 1;
А плюс один тут зачем? Ты ж увеличиваешь указатель и постепенно выходишь за границы массива buffer, а туда нельзя.
MBo (2007-04-11 07:04:00) [10]а буфера [0..4096] достаточно?