Главная страница
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.025 c
15-1202844973
ocean
2008-02-12 22:36
2008.03.23
Пароль на включение ноутбука


15-1202698605
Буран
2008-02-11 05:56
2008.03.23
Как откомпилировать сишную dll в Билдере?


15-1202726243
Ломброзо
2008-02-11 13:37
2008.03.23
КПК - must have


11-1186397670
Александр 2006
2007-08-06 14:54
2008.03.23
Снова про Proxies.dcu


11-1186050008
Andrey_rus
2007-08-02 14:20
2008.03.23
Выравнивание контролов