![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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