Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Заменитель System.AssignFile для юникодных имен   Найти похожие ветки 

 
Alextp ©   (2006-02-21 20:47) [0]

Мне нужно оперировать с _юникодными_ именами файлов, делать обычные операции: Readln/Writeln/BlockRead/BlockWrite. System.AssignFile не допускает на входе юникодного имени. Есть ли заменитель для AssignFile в виде другой функции или же заменитель всех этих функций в виде класса, позволяющего работать с юникодными именами, делать все то же самое? Нужно для D5-D6.


 
TUser ©   (2006-02-21 20:55) [1]

> System.AssignFile не допускает на входе юникодного имени.

Прекрасно позволяет. Приведи код, который работает не так, как хочешь.


 
Игорь Шевченко ©   (2006-02-21 20:58) [2]

В system.pas все процедуры (TextOpen) описаны, можно написать свои, можно поискать, вдруг уже кто-то написал.


 
Alextp ©   (2006-02-21 23:24) [3]


> Прекрасно позволяет. Приведи код, который работает не так,
>  как хочешь.

1. В System.pas AssignFile описана так:
procedure _Assign(var T: Text; S: ShortString);
и так:
procedure AssignFile(var F; FileName: string);

Где ты здесь видишь WideString? Работа только с ANSI строками.

2. Посмотрев в исходники System.pas, ты не найдешь вызовов CreateFileW, только CreateFile. Т.о., _нет_ работы с WideString именами.


 
Игорь Шевченко ©   (2006-02-22 01:01) [4]

Alextp ©   (21.02.06 23:24) [3]

Напиши/найди процедуру TextOpenW с заменой

   Temp := CreateFileA(t.Name, OpenMode, FILE_SHARE_READ, nil, Flags, FILE_ATTRIBUTE_NORMAL, 0);

на CreateFileW


 
jack128 ©   (2006-02-22 02:25) [5]

Помимо Printers.pas вот еще примерчик для текстовых файлов..
DimandShark (c)
unit conio;

interface

implementation

uses
Windows;

// To avoid importing SysUtils
const
fmClosed = $D7B0;
fmInput  = $D7B1;
fmOutput = $D7B2;
fmInOut  = $D7B3;

type
PTextBuf = ^TTextBuf;
TTextBuf = array[0..127] of Char;
TTextRec = packed record
  Handle: Integer;
  Mode: Integer;
  BufSize: Cardinal;
  BufPos: Cardinal;
  BufEnd: Cardinal;
  BufPtr: PChar;
  OpenFunc: Pointer;
  InOutFunc: Pointer;
  FlushFunc: Pointer;
  CloseFunc: Pointer;
  case integer of
    0: (OldOpenFunc, OldInOutFunc, OldFlushFunc, OldCloseFunc: Pointer);
    1: (
      UserData: array[1..32] of Byte;
      Name: array[0..259] of Char;
      Buffer: TTextBuf);
end;

TTextFunc = function(var F: TTextRec): Integer;

function InOutFunc(var F: TTextRec): Integer;
begin
case F.Mode of
  fmOutput: begin
    AnsiToOemBuff(F.BufPtr, F.BufPtr, F.BufPos);
    Result := TTextFunc(F.OldInOutFunc)(F);
  end;
  fmInput: begin
    Result := TTextFunc(F.OldInOutFunc)(F);
    if F.BufEnd > 0 then
      OemToAnsiBuff(F.BufPtr, F.BufPtr, F.BufEnd);
  end;
else
  Result := TTextFunc(F.OldFlushFunc)(F);
end;
end;

function FlushFunc(var F: TTextRec): Integer;
begin
case F.Mode of
  fmOutput: begin
    AnsiToOemBuff(F.BufPtr, F.BufPtr, F.BufPos);
    Result := TTextFunc(F.OldFlushFunc)(F);
  end;
else
  Result := TTextFunc(F.OldFlushFunc)(F);
end;
end;

function OpenFunc(var F: TTextRec): Integer;
begin
Result := TTextFunc(F.OldOpenFunc)(F);
with F do
  begin
    OldInOutFunc := InOutFunc;
    OldFlushFunc := FlushFunc;
    OldCloseFunc := CloseFunc;
    InOutFunc := @conio.InOutFunc;
    FlushFunc := @conio.FlushFunc;
  end;
end;

procedure InitConsoleIO;
begin
with TTextRec(Output) do
  begin
    OldOpenFunc := OpenFunc;
    OpenFunc := @conio.OpenFunc;
  end;
with TTextRec(Input) do
  begin
    OldOpenFunc := OpenFunc;
    OpenFunc := @conio.OpenFunc;
  end;
end;

initialization
InitConsoleIO;

end.


 
AlexeyT ©   (2006-02-22 08:26) [6]


> Напиши/найди процедуру TextOpenW с заменой
>    Temp := CreateFileA(t.Name, OpenMode, FILE_SHARE_READ,
>  nil, Flags, FILE_ATTRIBUTE_NORMAL, 0);

Нет такого кода в System.pas. CreateFileA там вызывается в *.asm файлах так:
 PUSH    0
 PUSH    FILE_ATTRIBUTE_NORMAL
 PUSH    ECX
 PUSH    0
 PUSH    EDX
 PUSH    EAX
 LEA     EAX,[ESI].FileName
 PUSH    EAX
 CALL    CreateFileA

И еще в куче мест.
Переделать _это_ на CreateFileW не получится. К тому же юникодное имя надо как-то хранить в TTextRec...


> Помимо Printers.pas вот еще примерчик для текстовых файлов.

Спасибо, посмотрю.


 
TUser ©   (2006-02-22 09:36) [7]

Какая у автора версия Delphi? В D7 параметр FileName имеет тип String.


 
AlexeyT ©   (2006-02-22 22:07) [8]

У автора (у меня, я поменял свой ник) D4-D5. В D6 не смотрел.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.066 c
2-1141630475
Alex_C
2006-03-06 10:34
2006.03.26
Аналог сишного sscanf?


15-1141374871
Black_phoenix
2006-03-03 11:34
2006.03.26
Удалёная установка программ


2-1142279229
LordOfRock
2006-03-13 22:47
2006.03.26
Дерево и много текста


2-1141880160
Rado
2006-03-09 07:56
2006.03.26
dbgrid


2-1141226299
KyRo
2006-03-01 18:18
2006.03.26
Ado Table





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