Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
10-1143801664
marcel
2006-03-31 14:41
2008.03.23
Журнализирование в сервере приложений


2-1203860838
dramadol
2008-02-24 16:47
2008.03.23
Обрезать длину файла при перезаписи


15-1202600368
NeyroSpace
2008-02-10 02:39
2008.03.23
QUIK


15-1202636826
@!!ex
2008-02-10 12:47
2008.03.23
Что за группа? Что за трэк?


2-1203691244
San1
2008-02-22 17:40
2008.03.23
наследование свойства OnMouseMove





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский