Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi [TFileStream] Widestring Dateinamen (https://www.delphipraxis.net/130044-%5Btfilestream%5D-widestring-dateinamen.html)

Muetze1 2. Mär 2009 15:26

Re: [TFileStream] Widestring Dateinamen
 
Zitat:

Zitat von himitsu
Weiß zufällig wer, wo in D5 die nötigen Resourcestrings liegen?

Zitat aus der EnhancedStreams.pas aus meiner XMLLib, welche genau das hier gesuchte implementieren (mit Dank an Herrn Dobrushin):
Delphi-Quellcode:
uses
{$IFDEF COMPILER_6_UP}
  RTLConsts,
{$ELSE}
  Consts,
{$ENDIF}

himitsu 2. Mär 2009 15:38

Re: [TFileStream] Widestring Dateinamen
 
Zitat:

Zitat von Muetze1
Zitat aus der EnhancedStreams.pas aus meiner XMLLib, welche genau das hier gesuchte implementieren (mit Dank an Herrn Dobrushin):
...

Bliebe jetzt nur noch die Frage, ob die Konstanten da genauso heißen und ob der Inhalt (Parameter) paßt.
> SFCreateErrorEx
> SFOpenErrorEx

Muetze1 2. Mär 2009 15:45

Re: [TFileStream] Widestring Dateinamen
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Muetze1
Zitat aus der EnhancedStreams.pas aus meiner XMLLib, welche genau das hier gesuchte implementieren (mit Dank an Herrn Dobrushin):
...

Bliebe jetzt nur noch die Frage, ob die Konstanten da genauso heißen und ob der Inhalt (Parameter) paßt.
> SFCreateErrorEx
> SFOpenErrorEx

Nein und nein, da die Ex Strings erst später definiert wurden. Die ohne Ex hingegen funktionieren auf allen Delphi Versionen. Alternativ nachdefinieren bei Delphi vor 6.

Delphi-Quellcode:
{ TUnicodeFileStream }

Constructor TUnicodeFileStream.Create(Const FileName: WideString; Const AMode: Word);
Var
  CreateHandle: Integer;
Begin
  If ( AMode = fmCreate ) Then
  Begin
    CreateHandle := WideFileCreate(FileName);

    If ( CreateHandle < 0 ) Then
      Raise EFCreateError.CreateResFmt(PResStringRec(@SFCreateError), [FileName]);
  End
  Else
  Begin
    CreateHandle := WideFileOpen(FileName, AMode);

    If ( CreateHandle < 0 ) Then
      Raise EFOpenError.CreateResFmt(PResStringRec(@SFOpenError), [FileName]);
  End;
 
  Inherited Create(CreateHandle);
End;

himitsu 2. Mär 2009 16:33

Re: [TFileStream] Widestring Dateinamen
 
OK, dann noch ohne die ...Ex-Strings
Delphi-Quellcode:
// UnicodeFileStream.pas

Unit UnicodeFileStream;

Interface
  Uses {$IF CompilerVersion >= 14.0}RTLConsts{$ELSE}Consts{$IFEND}, Windows, SysUtils, Classes;

  Type TFileStreamX = Class(TFileStream)
    Public
      Constructor Create(Const FileName: WideString; Mode: Word);                  Overload;
      Constructor Create(Const FileName: WideString; Mode: Word; Rights: Cardinal); Overload;
      Destructor Destroy; Override;
    End;

Implementation
  Constructor TFileStreamX.Create(Const FileName: WideString; Mode: Word);
    Begin
      Create(Filename, Mode, 0);
    End;

  Constructor TFileStreamX.Create(Const FileName: WideString; Mode: Word; Rights: Cardinal);
    Const AccessMode: Array[0..2] of LongWord = (GENERIC_READ, GENERIC_WRITE, GENERIC_READ or GENERIC_WRITE);
      ShareMode: Array[0..4] of LongWord = (0, 0, FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE);

    Begin
      If Mode = fmCreate Then Begin
        Inherited Create(CreateFileW(PWideChar(FileName), GENERIC_READ or GENERIC_WRITE,
          0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
        If FHandle < 0 Then
          Raise EFCreateError.CreateFmt(SFCreateError, [ExpandFileName(FileName)]);
      End Else Begin
        If ((Mode and 3) <= fmOpenReadWrite) and ((Mode and $F0) <= fmShareDenyNone) Then Begin
          Inherited Create(CreateFileW(PWideChar(FileName), AccessMode[Mode and 3],
            ShareMode[(Mode and $F0) shr 4], nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0));
        End Else Inherited Create(0);
        If FHandle < 0 Then
          Raise EFOpenError.CreateFmt(SFOpenError, [ExpandFileName(FileName)]);
      end;
    End;

  Destructor TFileStreamX.Destroy;
    Begin
      If FHandle >= 0 Then FileClose(FHandle);
      Inherited Destroy;
    End;

End.
falls des mit den CONDITIONALEXPRESSIONS ( {$IF ...} ) in der DelphiVersion noch nicht klappt, dann sag Bescheid.

bzw. hast du die JEDI's installiert?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz