Ver Mensaje Individual
  #2  
Antiguo 30-04-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Reputación: 21
cHackAll Va por buen camino
Analizando una unidad de los propios componentes que citaste, podemos formarnos algúnas ideas a implementar;

1. Ataquemos a la clase TFileStream, la cual sobrecargada tiene un método útil de la clase padre (THandleStream), de creación que permite inicializar por manejador "FHandle"
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
 var FindData: TWin32FindDataW; Stream: TFileStream;
 begin
  Windows.FindClose(FindFirstFileW('*.jpg', FindData)); // solo para obtener el nombre del primer archivo JPEG, esperando tenga su nombre en UNICODE
 Stream := TFileStream.Create(CreateFileW(@FindData.cFileName, GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0));
 
 ...
Donde la API CreateFileW es la encargada de archivo en modo UNICODE dado el nombre brindado en este caso por FindFirstFileW.

2. Podríamos hasta realizar nuestra propia clase sobrecargando el método;
Código Delphi [-]
uses RTLConsts;
  
 type
  TFileStreamW = class(TFileStream)
   constructor Create(const lpFileName: PWideChar); overload;
  end;
 
 constructor TFileStreamW.Create(const lpFileName: PWideChar);
 begin
  inherited Create(CreateFileW(lpFileName, GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0));
  if FHandle < 0 then
   raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(lpFileName), SysErrorMessage(GetLastError)]);
 end;
Utilizándola de igual forma;
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
 var FindData: TWin32FindDataW; Stream: TFileStreamW;
 begin
  Windows.FindClose(FindFirstFileW('*.jpg', FindData));
  Stream := TFileStreamW.Create(@FindData.cFileName);
 
 ...
Hasta podemos idearnos una 3ra forma más sencilla sin conocimientos de POO;
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
 var
  FindData: TWin32FindDataW; 
  FileName: array [0..MAX_PATH-1] of WideChar;
  Stream: TFileStream;
 begin
  Windows.FindClose(FindFirstFileW('*.jpg', FindData)); 
  GetShortPathNameW(@FindData.cFileName, @FileName, SizeOf(FileName));
  Stream := TFileStream.Create(string(WideString(@FileName)), fmOpenRead);
 
...
Donde la API GetShortPathNameW está obteniendo el antigüo nombre 8.3 accesible por la VCL.

Nota; Para obtener el nombre del archivo con la intervencion del usuario, en lugar de usar la API FindFirstFileW, debemos utilizar la API GetOpenFileNameW abstraída de TOpenDialog con su apropiada estructura TOpenFilenameW.

Como verás depende netamente de la habilidad del programador, no así de la version del IDE

Saludos

Última edición por cHackAll fecha: 30-04-2008 a las 18:32:06. Razón: some issues
Responder Con Cita