Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Comment lire un fichier .INF pour le récupérer dans un TMEMO de Delphi 7 ?
    Bonjour,
    J'ai écrit jadis un programme en Delphi 7 pour rechercher une information dans des fichiers de types texte (.PAS .BAT.TXT ...).
    Je voudrais l'utiliser pour faire la même chose avec des fichiers .INF issus des .CAB des drivers d'imprimantes de Windows 10.
    Malheureusement ces fichiers ont deux particularités :
    - les premiers octets ont des valeurs particulières (voir le .jpg), j'ai rien trouvé sur la signification de ces octets, et TMemo n’affiche que 2 caractères.
    - chaque caractère est sur 2 octets, le deuxième a la valeur 00 je suppose de l'Unicode (pas supporté par Delphi 7)
    Remarques :
    Lecture de ces .Inf : Notepad et Wordpad arrive correctement, JvMemo met un blanc après chaque caractère.
    Pourquoi lire des inf explication dans :
    https://www.developpez.net/forums/d2034969/systemes/windows/windows-10/exporter-driver-d-imprimante-d-ordinateur-sous-windows-10-a/#
    Question :
    Avant d'injecter le fichier INF dans un TMemo peut-on par TStream ou autre composant neutraliser les octets parasites et si oui comment ?
    D'avance merci.

  2. #2
    Membre émérite
    Ton ficher 'inf' est un Unicode. Donc en D7 tu peux (entre autres) lire dans un TMemoryStream à partir du 3ème octet en prenant un octet sur deux et le mettre dans un string ;

  3. #3
    Membre du Club
    Suite
    ---------------------
    Bonjour,
    Grand merci cela fonctionne parfaitement.
    Voici mon essai :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    // **************************************************
    procedure TForm1.Button1Click(Sender: TObject);
      VAR
        P : Integer;
        Flux :TMEMORYSTREAM;
        Longueur : Longint;
        Buffer : Byte;
        Travail : Boolean;
        Info : String;
      BEGIN
        TRY
        Memo1.Clear;
        Flux:=TMEMORYSTREAM.CREATE;	// Créer un flux en mémoire
        Flux.LoadFromFile(Edit1.Text);
        Flux.SEEK(4,0);	// Origine : 0 début, 1 position courant
        Longueur:=Flux.Size;
        Travail:=True;
        P:=4;
        Info:='';
        While Travail Do
          Begin
            Flux.READ(Buffer,1);// Récupérer un octet
            Info:=Info+CHR(Buffer);
            // Déplacer de 1 le pointeur pour sauter le "0"
            Flux.SEEK(1,1);
            P:=P+2;
            If P>longueur Then Travail:=False;
          end;
        Memo1.Lines.Add(Info);
          FINALLY
            Flux.Free; // Détruire l'objet
          END
      end;
    // **************************************************

    Il est certainement possible de faire plus simple ou plus "académique".

  4. #4
    Membre éprouvé
    Bonjour,

    une autre méthode:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    procedure TForm4.Button2Click(Sender: TObject);
    var
      s: array of WideChar;
      P: PWideChar;
    begin
      with TMemoryStream.Create do
      try
        LoadFromFile('usb.inf');
        SetLength(S, Size);
        P := @S[0];
        ReadBuffer(P^, size);
        Memo1.Text := P;
      finally
        Free;
      end;
    end;


    Cordialement,

    @+

  5. #5
    Membre du Club
    Suite
    Bonjour,
    Merci, votre solution est bien plus professionnelle.
    Question complémentaire :
    Je suppose qu’il doit encore exister des fichiers INF non « Unicode ». Pour faire la différence peut-on tester les 2 premiers octets ? Si oui sur quelle valeur ?
    D’avance merci.

  6. #6
    Membre émérite
    Citation Envoyé par dennler Voir le message
    Bonjour,
    Merci, votre solution est bien plus professionnelle.
    Question complémentaire :
    Je suppose qu’il doit encore exister des fichiers INF non « Unicode ». Pour faire la différence peut-on tester les 2 premiers octets ? Si oui sur quelle valeur ?
    D’avance merci.
    Sur les deux premiers octets FF et FE

  7. #7
    Membre éclairé
    Bonjour

    Citation Envoyé par ALWEBER Voir le message
    Sur les deux premiers octets FF et FE
    Il s'agit du BOM (byte order mark) il peut valoir FFFE en UTF16 LE (souvent depuis Windows) ou FEFF en UTF16 BE https://en.wikipedia.org/wiki/Byte_order_mark

    NB Il y en a d'autres mais peu utilisés même celui destiné à UTF8 (EFBBBF traduction directe en UTF8 des BOM UTF16) n'est quasiment jamais positionné.

    Cordialement

###raw>template_hook.ano_emploi###