Главная страница
    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.01 c
15-1202605179
Linker
2008-02-10 03:59
2008.03.23
Когда я пишу const aRecord в параметре функции, то туда передаётс


2-1203944488
tytus
2008-02-25 16:01
2008.03.23
как Определить имя компа в локальной сети по IP адресу?


2-1203659963
АИК
2008-02-22 08:59
2008.03.23
PostMessage


2-1203682299
Gauss
2008-02-22 15:11
2008.03.23
Что-то вроде транслитератора.


15-1202741305
БарЛог
2008-02-11 17:48
2008.03.23
Статья о передаче файлов потоком





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский