Главная страница
    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.075 c
3-1278415327
kyn66
2010-07-06 15:22
2013.03.22
Ошибка на одном из трех компов


15-1345527113
ProgRAMmer Dimonych
2012-08-21 09:31
2013.03.22
Можно ли запретить CryptoAPI лезть в сеть?


8-1225970127
Voffka
2008-11-06 14:15
2013.03.22
Кнопки управления окном


15-1337598756
p
2012-05-21 15:12
2013.03.22
Сертификат Verisign


15-1331806770
Musecd
2012-03-15 14:19
2013.03.22
Как в Delphi 2010 (2007-XE2) настроить цвет выделения кода ?





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