![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк при вызове функции [D6, Win95/98]
Жорик © (2004-07-20 11:39:00)По FormActivate вызывается функция типа String и переодически(!)
при ее вызове происходит ошибка EAccessViolation.
В самой функции ошибок нет и она выполняется от начала до конца.
К тому же если бы в функии была ошибка, то она проявлялась постоянна, а не от случая к случаю.
С чем может связана эта ошибка?
Заранее спасибо!
Суслик (2004-07-20 14:26:00) [1]согласен
Anatoly Podgoretsky (2004-07-20 14:25:00) [2]Отсутствия знания ведет к AV
Суслик (2004-07-20 14:16:00) [3]
> при неопределенном состоянии этого ImgRes
это если при неопределенном.
мы то не знаем - определенное состояние или нет.
Жорик (2004-07-20 13:52:00) [4]Проблема по-видимому была именно с динамеческим массивом.
После того, как исправил DataFileBuf[1] на DataFileBuf[0], ошибка
больше не повторялась.
Всем спасибо!
Anatoly Podgoretsky (2004-07-20 13:35:00) [5]В случае возникновения ошибки при TResourceStream.Create будет в обязательном порядке вызвано ImgRes.Free; при неопределенном состоянии этого ImgRes
Суслик (2004-07-20 13:16:00) [6]
> Забавно ты используешь try...finally
не красиво, но в данном случае, может быть и правильно, т.к. где описана ImgRes не видно - вполне может быть, что он и очищает ее в nil :)))
stone (2004-07-20 13:13:00) [7]
> try
> ImgRes :=TResourceStream.Create(hInstance,ImgResName[Random(4)],RT_RCDATA);//извлекаем
> случайный
> //ресурс картинки
> ImgRes.SaveToFile(ImageFile);//сохраняем в файл
> finally
> ImgRes.Free;
> end;
Забавно ты используешь try...finally
Digitman (2004-07-20 13:09:00) [8]
> Насколько я помню если с 0 компилятор начинает ругаться
с какого перепугу он начнет "ругаться", если массив формируется в ран-тайм?
Суслик (2004-07-20 12:55:00) [9]
> А это может быть как-то связано с ошибкой?
еще как
Жорик (2004-07-20 12:53:00) [10]c какого перепугу индексация эл-тов дин.массива у тебя начинается с единицы ?</>
Насколько я помню если с 0 компилятор начинает ругаться.
А это может быть как-то связано с ошибкой?
Digitman (2004-07-20 12:50:00) [11]
> Жорик
c какого перепугу индексация эл-тов дин.массива у тебя начинается с единицы ?
Жорик (2004-07-20 12:28:00) [12]Функция выполняется полностью и "упаковывает" файл вполне успешно. А Randomize я просто забыл написать она вызывается перед строкой ImageFile :=CurDir+'\'+Img00'+IntToStr(Random(10))+'.jpg'
clickmaker (2004-07-20 12:21:00) [13]Randomize вызвал перед Random?
Проверь еще ImgRes <> nil
Суслик (2004-07-20 12:18:00) [14]я не буду это даже смотреть.
я что - сам должен выравнивание по левому краю делать?
Жорик (2004-07-20 12:15:00) [15]функия прячет в конец картинки указанный файл (параметр strFileName) и добавляет 2
байта информации о размере картинки в конец файла для того, чтобы в дальнейшем добавленный файл
можно было извлечь из картинки.
Картинки являются ресурсами "вшитыми" в программу и извлекаются случайным образом. Всего 4
картинки.
При вызове этой функции, как я говорил, возникает ошибка EAccessViolation
function WriteFileToImage(strFileName:String):String;
const
ImgResName:array[0..3] of String =('Img1','Img2','Img3','Img4');//имена ресурсов картинок
var
DataFileBuf:array of Byte;
ImageLen:Word;
DataFileLen:DWORD;
ImageFile:String;
FD,ImgF:File;
CurDir:String;
begin
GetDir(0,CurDir);
ImageFile :=CurDir+'\'+Img00'+IntToStr(Random(10))+'.jpg';//случайное имя для файла-картинки
try
ImgRes :=TResourceStream.Create(hInstance,ImgResName[Random(4)],RT_RCDATA);//извлекаем случайный
//ресурс картинки
ImgRes.SaveToFile(ImageFile);//сохраняем в файл
finally
ImgRes.Free;
end;
AssignFile(FD,strFileName);
AssignFile(ImgF,ImageFile);
try
Reset(FD,1);
Reset(ImgF,1);
DataFileLen :=FileSize(FD);
ImageLen :=FileSize(ImgF);
SetLength(DataFileBuf,DataFileLen);
Seek(ImgF,ImageLen);//перемещаемся на длину файла-картинки
BlockRead(FD,DataFileBuf[1],DataFileLen);//читаем файл
BlockWrite(ImgF,DataFileBuf[1],DataFileLen);//записываем в конец картинки весь файл
BlockWrite(ImgF,ImageLen,SizeOf(Word));//запоминем длину картинки, чтобы потом можно было
finally //извлечь файл из нее файл
CloseFile(FD);
CloseFile(ImgF);
DeleteFile(strFileName);
end;
Result :=ImageFile;
end;
Digitman (2004-07-20 12:12:00) [16]на то и пальцы
Суслик (2004-07-20 11:59:00) [17]он уже на другой форум пошел - здесь все пальцы гнут
VMcL (2004-07-20 11:56:00) [18]>> Жорик (20.07.04 11:39)
Больше нечего добавить?
Digitman (2004-07-20 11:45:00) [19]
> вызывается функция типа String
поди из DLL эта ф-ция ..
Суслик (2004-07-20 11:41:00) [20]очередной массовик затейник игры "а ну ка отгодай"
код приводи