Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c