Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ReadFile и юникод


dracula ©   (2008-02-26 11:21:00) 

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


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;


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

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


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

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


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

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

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:27:00) [4]

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


clickmaker   (2008-02-26 12:19:00) [5]

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


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

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


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


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

?


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

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


clickmaker   (2008-02-26 11:58:00) [9]

998 - это Invalid access to memory location


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

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


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

Спроси у GetLastError


Наверх

Титульная страница Поиск, карта сайта Написать письмо