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

Вниз

Копирование по списку   Найти похожие ветки 

 
Steep ©   (2007-04-11 06:56) [0]

Есть список 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;


 
MBo ©   (2007-04-11 07:04) [1]

а буфера [0..4096] достаточно?


 
TUser ©   (2007-04-11 07:06) [2]


>      p := StrECopy( p, PChar( LB.Items.Strings[i]) ) + 1;

А плюс один тут зачем? Ты ж увеличиваешь указатель и постепенно выходишь за границы массива buffer, а туда нельзя.


 
TUser ©   (2007-04-11 07:09) [3]

А понял. 80 путей - это как раз примерно 4кб и занимает. А дальше ты залезаешь, куда нельзя.


 
Steep ©   (2007-04-11 07:13) [4]


> А понял. 80 путей - это как раз примерно 4кб и занимает.
>  А дальше ты залезаешь, куда нельзя.

т.е. просто увеличить буфер? а до скольки можно увеличить?


> А плюс один тут зачем? Ты ж увеличиваешь указатель и постепенно
> выходишь за границы массива buffer, а туда нельзя.

Незнаю так в примере было. Убрать можно?


 
MBo ©   (2007-04-11 07:18) [5]

>Убрать можно?
Нет. Строки должны разделяться нулями, вот для нуля место и оставляется, насколько я понимаю


 
Steep ©   (2007-04-11 07:30) [6]

А в буфер можно записать 51200000?


 
SlymRO ©   (2007-04-11 07:44) [7]

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 08:45) [8]

Спасибо!


 
SlymRO ©   (2007-04-11 08:48) [9]

Steep ©   (11.04.07 8:45) [8]
Помни! последний элемент должен быть 2 нуля #0 т.е. #0#0


 
Steep ©   (2007-04-11 09:02) [10]


> Помни! последний элемент должен быть 2 нуля #0 т.е. #0#0

т.е. + 1 +1 или + #0 + #0 ??



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

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

Наверх




Память: 0.49 MB
Время: 0.035 c
15-1174495968
SkySpeed
2007-03-21 19:52
2007.04.29
Как исправить ошибку с повреждённым файлом реестра?..............


2-1176107023
ppcumax
2007-04-09 12:23
2007.04.29
Как архивировать файлы в ZIP архивы?


9-1148749051
DevilDevil
2006-05-27 20:57
2007.04.29
Как совмещать 3D &amp; 2D


11-1129982635
homm
2005-10-22 16:03
2007.04.29
GRush Controls


3-1170846131
Sour Smile
2007-02-07 14:02
2007.04.29
Редактируемый TQuery