Форум: "Основная";
Текущий архив: 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