Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Заменитель 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
6-1134651981
(CHALING 32)S K i N E R
2005-12-15 16:06
2006.03.26
Голосовой чат!


2-1141996920
Fenix
2006-03-10 16:22
2006.03.26
Преобразование названия цветов


2-1142189230
Dublicator
2006-03-12 21:47
2006.03.26
Поиск в стеке


2-1142183531
Din
2006-03-12 20:12
2006.03.26
Как удалить и скопировать файлы по маске?


15-1141160136
TStas
2006-02-28 23:55
2006.03.26
Кстати, была интересная ветка про возведение в встепень