Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Access Violation on AssignFile(fp, file_name)   Найти похожие ветки 

 
LDV   (2012-02-28 00:43) [0]

Доброго времени суток.

почему, когда передаю в качестве параметра file_name строку

load_file("D:\Test\Updater\Bin\Updater.exe", @Len);

возникает исключение Access Violation при выполнении AssignFile(fp, file_name)?


{ load file, returning pointer to file  //
 data, exits with error message if out //
 of memory or not found }              //
function load_file(file_name: PChar;    //char* load_file(char* file_name,
 size_ret: Psize_t): PShortIntArray;   //..size_t* size_ret)
var                                     //
 fp: File of Char;                     //FILE* fp;
 data: PShortIntArray;                 //char* data;
 buffer: array[0..BUFFER_SIZE-1] of    //char buffer[BUFFER_SIZE];
   Char;                               //
 len: size_t;                          //size_t len;
 cur_len: size_t;                      //size_t cur_len;
 tmp: PShortIntArray;                  //char* tmp = realloc(data, cur_len
                                       //..+ len);
begin                                   //{
                                       //  FILE* fp;
                                       //  char* data;
                                       //  char buffer[BUFFER_SIZE];
                                       //  size_t len;
                                       //  size_t cur_len;
 { open file }                         //
 AssignFile(fp, file_name);            //  fp = fopen(file_name, "rb");
 Reset(fp);                            //
 if (IOResult <> 0) then               //  if(!fp) {
 begin                                 //
   perror(file_name);                  //
   Halt(1);                            //    exit(1);
 end;                                  //  }
                                       //
 { read file }                         //
 cur_len := 0;                         //  cur_len = 0;
 data := nil;                          //  data = 0;
 BlockRead(fp, buffer, BUFFER_SIZE,    //  while((len = fread(buffer, 1,
   len);                               //..  BUFFER_SIZE, fp))) {
 while (len > 0) do                    //
 begin                                 //
   tmp := data;                        //    char* tmp = realloc(data, cur_len
   ReallocMem(tmp, cur_len + len);     //..     + len);
   if not Assigned(tmp) then           //    if(!tmp) {
   begin                               //
     WriteStrFmt(stderr,               //      fprintf(stderr,
       "%s: Virtual memory exhausted"  //..      "%s: Virtual memory exhausted
       + #13#10, [progname]);          //..      \n", progname);
     Halt(1);                          //      exit(1);
   end;                                //    }
   data := tmp;                        //    data = tmp;
   Move(buffer, data[cur_len],         //    memcpy(data + cur_len, buffer,
      len);                            //..    len);
   Inc(cur_len, len);                  //    cur_len += len;
   BlockRead(fp, buffer, BUFFER_SIZE,  //  }
     len);                             //
 end;                                  //
 if not EOF(fp) then                   //  if(!feof(fp)) {
 begin                                 //
   perror(file_name);                  //    perror(file_name);
   CloseFile(fp);                      //    fclose(fp);
   Halt(1);                            //    exit(1);
 end;                                  //  }
                                       //
 { exit }                              //
 CloseFile(fp);                        //  fclose(fp);
 if Assigned(size_ret) then            //  if(size_ret)
   size_ret^ := cur_len;               //    *size_ret = cur_len;
 Result := data;                       //  return data;
end;    


 
LDV   (2012-02-28 00:46) [1]

аналогично:


procedure TForm1.FormCreate(Sender: TObject);
var
 fp: File of Char;
 file_name: PChar;
begin
 file_name := "C:\Program Files\Updater\bin\Updater.exe";
 AssignFile(fp, file_name);
end;


 
Забаненный   (2012-02-28 03:17) [2]


> LDV   (28.02.12 00:46) [1]
>
> аналогично:
>

что аналогично? АV? Ну вот я тупо вставил этот код [1], у меня все хорошо.
Уверен в месте определения ошибки? AssignFilу пофиг даже наличие файла, и правильность имени. Например, у меня вполне работает
var
fp: File of Char;
file_name: PChar;
begin
file_name := "@!%@^&&#*:::&&#%&@@&#&$@!!>>";
AssignFile(fp, file_name);


и забавно - бинарники чарами...


 
sniknik ©   (2012-02-28 07:54) [3]

> и забавно - бинарники чарами...
"переведено" с С, и как видно не корректно, char в дельфи и в С разные типы. там это чистый "байт", а то и shortint, а "чистый" это unsigned char...  ну что то типа.


 
sniknik ©   (2012-02-28 08:00) [4]

> почему, ...
это кара небесная за то что в дельфи на С пытаешься писать... пиши на дельфи и наступит счастье...
всю эту лабуду из [0] в дельфи делают парой тройкой строк с TFileStream.


 
sniknik ©   (2012-02-28 08:14) [5]

p.s. AV может возникать если ты где то выше переопределил PChar, и он лишился "магии дельфи"... (хотя не должно быть, там, в AssignFile вроде явный тип, должно привести правильно, даже массив... или тоже замена?).
неважно, попробуй так
load_file("D:\Test\Updater\Bin\Updater.exe"#0, @Len);


 
CRLF   (2012-02-28 09:11) [6]

Что вообще за PShortIntArray? В исходном тексте char *.

А вообще не майся фигнёй, а используй TFileStream (возможно, вместе с TMemoryStream).


 
sniknik ©   (2012-02-28 09:34) [7]

> Что вообще за PShortIntArray? В исходном тексте char *.
вообще, именно здесь правильный "перевод" по типам.


 
CRLF   (2012-02-28 09:51) [8]

"Правильный" = "такой, как нужно автору"? Возможно. Хотя ещё вопрос, как именно определён тип PShortIntArray.


 
sniknik ©   (2012-02-28 09:54) [9]

нет, правильный по тому, что означает тип в С и делфи. см. [3]


 
CRLF   (2012-02-28 10:04) [10]

Да, перепутал ShortInt и SmallInt.

Но ведь в Delphi (по крайней мере, XE и XE2) нет встроенного типа PShortIntArray? Или я куда-то не туда смотрю?



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

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.073 c
2-1334905200
Unknown user
2012-04-20 11:00
2013.03.22
Непонятная ошибка компиляции


15-1333119005
Baks
2012-03-30 18:50
2013.03.22
#10008 - replace hard disk1


15-1336633312
jacksotnik
2012-05-10 11:01
2013.03.22
Закрыть файл


15-1340137805
Юрий
2012-06-20 00:30
2013.03.22
С днем рождения ! 20 июня 2012 среда


1-1296196081
Сергей Р.
2011-01-28 09:28
2013.03.22
Ошибка SOAP: Тег конца "head" не соответствует тегу начала "meta"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский