Главная страница
    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-1329256529
Deltas
2012-02-15 01:55
2013.03.22
Что за... сообщение в Delphi XE2.


15-1330763551
Дмитрий
2012-03-03 12:32
2013.03.22
Добавление компонент на форму


15-1350457839
pasha_golub
2012-10-17 11:10
2013.03.22
Течет память. Кто виноват и что делать?


15-1340013994
Дмитрий С
2012-06-18 14:06
2013.03.22
Проверка орфографии.


15-1343987497
AV
2012-08-03 13:51
2013.03.22
Quip 2012. Как раз и навсегда изменить порт с 433 на 5190?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский