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

Вниз

ReadFile и юникод   Найти похожие ветки 

 
dracula   (2008-02-26 11:21) [0]

Проблема такая, отключтл в висте русский язык, и пытаюсь прочитать файл с юникодовыми символами в имени:


function StringToPWide(sStr: string; var iNewSize: integer): PWideChar;
var
 pw: PWideChar;
 iSize: integer;
begin
 iSize := Length(sStr) + 1;
 iNewSize := iSize * 2;

 pw := AllocMem(iNewSize);

 MultiByteToWideChar(CP_ACP, 0, PChar(sStr), iSize, pw, iNewSize);

 Result := pw;
end;

procedure TForm1.Button1Click(Sender: TObject);
var fname : PWideChar;
           g : integer;
           h : THandle;
         buf : PByteArray;
  returned : dword;
begin
 with OpenDialog1 do
 begin
   Execute;
   fname := StringToPWide(Filename, g);
 end;
 if FileExists(fname) then ShowMessage("ok") else ShowMessage("bad"); // здесь всё нормально файл существует

 h := CreateFileW(fname, GENERIC_READ,
                         FILE_SHARE_READ,
                         nil,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL, 0);

 ReadFile(h, buf^, 512, returned, nil); // а вот тут returned всегда = 0 без юникода файлы читаются, я чего-то недопонимаю. Файл не нулевого размера. Размер сектора на диске 512.
end;


 
Плохиш ©   (2008-02-26 11:28) [1]

Спроси у GetLastError


 
dracula   (2008-02-26 11:39) [2]

ошибка 998 - файл не существует? но почему?


 
clickmaker ©   (2008-02-26 11:58) [3]

998 - это Invalid access to memory location


 
dracula   (2008-02-26 12:01) [4]

ок, как обойти? ятут прочитал что для использования CreateFileW нужно использовать префикс для имени файла "\\?\C:\тест.htm" типо того, но всёравно непомогло таже ошибка


 
Плохиш ©   (2008-02-26 12:10) [5]


> ReadFile(h, buf^, 512, @returned, nil);

?


 
dracula   (2008-02-26 12:16) [6]

ReadFile(h, buf, 512, returned, nil); - (заменил ^buf на buf) вот так вроде заработало, сейчас протестирую ещё, посмотрю что считывается, но по крайней мере буфер заполняется и файл читается


 
clickmaker ©   (2008-02-26 12:19) [7]

не видно, где выделяется память под буфер


 
dracula   (2008-02-26 12:27) [8]

getmem(buf, 512); это я делаю, но проблема осталась, щас ещё посмотрю, сейчас считывается только по 1 байту, если больше то вылетает с ошибкой, но я думаю это уже мой косяк.


 
dracula   (2008-02-26 12:38) [9]

Нет немогу победить вот что сейчас у меня получилось:

procedure TForm1.Button1Click(Sender: TObject);
var fname : PWideChar;
   g : integer;
   h : THandle;
   buf : PByteArray;
   returned : dword;
begin
 with OpenDialog1 do
 begin
   Execute;
   fname := StringToPWide("\\?\" + Filename, g);
 end;
 if FileExists(fname) then ShowMessage("ok") else ShowMessage("bad");

 h := CreateFileW(fname, GENERIC_READ,
                         FILE_SHARE_READ,
                         nil,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL, 0);
 getmem(buf, 512);
 ReadFile(h, buf, 512, returned, nil);
 freemem(buf, 512);
 CloseHandle(h);
end;


вылетает с ошибкой немогу прочитать память и т.д. и т.п. если читать один байт, то всё ок, такое может быть если размер сектора неправильный, но он правильный, если вернуть адресный префикс ^ то работает, но с юникодом отказывается, без префикса только один байт - кто знает как победить?


 
dracula   (2008-02-26 12:41) [10]

Да кстати забыл добавить при чтении одного байта я использовал вместо PByteArray просто Byte


 
dracula   (2008-02-26 12:48) [11]

:) всё победил, всётаки мой косяк, я с размером сектора всётаки облажался, не с того диска начал файл открывать. Всем огромное спасибо, очень помогли!



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

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

Наверх




Память: 0.49 MB
Время: 0.016 c
2-1203672334
Ковалев Г.Н
2008-02-22 12:25
2008.03.23
Borland Delphi 2006


2-1203619274
Антон
2008-02-21 21:41
2008.03.23
выгрузка dll из пямяти


9-1168206700
akaValerius
2007-01-08 00:51
2008.03.23
Направление движения при повороте


15-1202892081
Ega23
2008-02-13 11:41
2008.03.23
Просьба типа вчерашней


15-1202610413
turbouser
2008-02-10 05:26
2008.03.23
Эй, админы...