IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

 Delphi Discussion :

Fichier Ini sous Seven 64bits !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 476
    Points : 1 347
    Points
    1 347
    Par défaut Fichier Ini sous Seven 64bits !
    Bonjour à toutes et à tous,

    Je viens d'essayer une ancienne application sous Seven 64bits, dans un dossier libre et avec droits Administrateur, le fichier Ini semble fonctionner (sauvegarde) mais à l'ouverture de l'application, les données sauvegardées ne sont pas réinscrites !

    Code :

    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
     
    procedure TFPhone.OKBtnClick(Sender: TObject);
    var  FichierIni : TInifile;
    begin
     
        FichierIni := TIniFile.Create(ChangeFileExt(Application.ExeName, '.LNG'));
     
        FichierIni.WriteString('PHONE', 'NumDial',NumPhone.Text );
     
        FichierIni.WriteString('PHONE', 'VocalMessage',EMessage.Text );
     
        FichierIni.Free;
     
     
    procedure TFPhone.FormCreate(Sender: TObject);
    var  FichierIni : TInifile;
    begin
     
      FichierIni := TIniFile.Create(ChangeFileExt(Application.ExeName, '.LNG'));//.
     
      NumPhone.Text := FichierIni.ReadString('PHONE', 'NumDial','  -  -  -  -  ' );
     
      EMessage.Text := FichierIni.ReadString('PHONE', 'VocalMessage','' );
     
     
      FichierIni.Free;
     
     
    end;
    Si quelqu'un à une idée ?

    J'utilise aussi l'unité Cport.pas et je suppose que c'est elle qui active ce défaut étant donné qu'elle utilise à un moment donné la base de registre.


    Merci d'avance,

    @+,

    Cincap

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 227
    Points : 28 228
    Points
    28 228
    Par défaut
    Et si tu ouvre le fichier ini avec Notepad, tes données sont-elles bien enregistrées dedans ????

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 476
    Points : 1 347
    Points
    1 347
    Par défaut
    @ sevyc64, Bonjour, bien entendu, c'est pour cette raison que je soupconne l'unité comport qui doit inscrire une valeur dans Regedit et qui provoque l'erreur "Registry error".

    D'autres modules dans cette application avec fichier ini fonctionnent correctement.

    @+,

    Cincap

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 227
    Points : 28 228
    Points
    28 228
    Par défaut
    Ça n'a rien à voir avec ton fichier ini alors.

    Si celui-ci n'est pas lu c'est certainement parce que ton programme plante avant d'exécuter le code de lecture

    Pour ce qui est de Comport, je n'ai plus de Delphi sous la main pour faire des tests, mais je n'ai pas souvenir que cette unité vienne inscrire quelque chose dans la base de registre.

    Quoiqu'il en soit, essaye de dérouler ton programme en pas à pas pour essayer de cibler la ligne de code qui provoque l'erreur.

    Je ne sais pas qu'elle version de Delphi tu utilise, mais moi j'utilisais Delphi 7 et je compatis car le débogage est exécrable sous cet IDE

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 476
    Points : 1 347
    Points
    1 347
    Par défaut
    @ sevyc64, pour ton information, l'application fonctionne correctement sur XP pack2.

    Les autre modules de cette application, fonctionnent sur seven sauf apparemment celui qui utilise l'unité Cport.pas.

    Fragment de cette unité :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    // store settings to registry
    procedure TCustomComPort.StoreRegistry(Reg: TRegistry);
    begin
      if spBasic in FStoredProps then
      begin
        Reg.WriteString('Port', Port);
        Reg.WriteString('BaudRate', BaudRateToStr(BaudRate));
        if BaudRate = brCustom then
          Reg.WriteInteger('CustomBaudRate', CustomBaudRate);
        Reg.WriteString('StopBits', StopBitsToStr(StopBits));
        Reg.WriteString('DataBits', DataBitsToStr(DataBits));
        Reg.WriteString('Parity', ParityToStr(Parity.Bits));
        Reg.WriteString('FlowControl', FlowControlToStr(FlowControl.FlowControl));
      end;
      if spOthers in FStoredProps then
      begin
        Reg.WriteString('EventChar', CharToStr(EventChar));
        Reg.WriteString('DiscardNull', BoolToStr(DiscardNull));
      end;
      if spParity in FStoredProps then
      begin
        Reg.WriteString('Parity.Check', BoolToStr(Parity.Check));
        Reg.WriteString('Parity.Replace', BoolToStr(Parity.Replace));
        Reg.WriteString('Parity.ReplaceChar', CharToStr(Parity.ReplaceChar));
      end;
      if spBuffer in FStoredProps then
      begin
        Reg.WriteInteger('Buffer.OutputSize', Buffer.OutputSize);
        Reg.WriteInteger('Buffer.InputSize', Buffer.InputSize);
      end;
      if spTimeouts in FStoredProps then
      begin
        Reg.WriteInteger('Timeouts.ReadInterval', Timeouts.ReadInterval);
        Reg.WriteInteger('Timeouts.ReadTotalConstant', Timeouts.ReadTotalConstant);
        Reg.WriteInteger('Timeouts.ReadTotalMultiplier', Timeouts.ReadTotalMultiplier);
        Reg.WriteInteger('Timeouts.WriteTotalConstant', Timeouts.WriteTotalConstant);
        Reg.WriteInteger('Timeouts.WriteTotalMultiplier', Timeouts.WriteTotalMultiplier);
      end;
      if spFlowControl in FStoredProps then
      begin
        Reg.WriteString('FlowControl.ControlRTS', RTSToStr(FlowControl.ControlRTS));
        Reg.WriteString('FlowControl.ControlDTR', DTRToStr(FlowControl.ControlDTR));
        Reg.WriteString('FlowControl.DSRSensitivity', BoolToStr(FlowControl.DSRSensitivity));
        Reg.WriteString('FlowControl.OutCTSFlow', BoolToStr(FlowControl.OutCTSFlow));
        Reg.WriteString('FlowControl.OutDSRFlow', BoolToStr(FlowControl.OutDSRFlow));
        Reg.WriteString('FlowControl.TxContinueOnXoff', BoolToStr(FlowControl.TxContinueOnXoff));
        Reg.WriteString('FlowControl.XonXoffIn', BoolToStr(FlowControl.XonXoffIn));
        Reg.WriteString('FlowControl.XonXoffOut', BoolToStr(FlowControl.XonXoffOut));
        Reg.WriteString('FlowControl.XoffChar', CharToStr(FlowControl.XoffChar));
        Reg.WriteString('FlowControl.XonChar', CharToStr(FlowControl.XonChar));
      end;
    end;
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    // store settings
    procedure TCustomComPort.StoreSettings(StoreType: TStoreType; StoreTo: string);
    var
      IniFile: TIniFile;
      Reg: TRegistry;
    begin
      try
        if StoreType = stRegistry then
        begin
          Reg := TRegistry.Create;
          try
            SetRegistry(Reg, StoreTo, Name);
            StoreRegistry(Reg);
          finally
            Reg.Free;
          end
        end else
        begin
          IniFile := TIniFile.Create(StoreTo);
          try
            StoreIniFile(IniFile);
          finally
            IniFile.Free;
          end
        end;
      except
        raise EComPort.CreateNoWinCode(CError_StoreFailed);
      end;
    end;
     
    // load settings
    procedure TCustomComPort.LoadSettings(StoreType: TStoreType; LoadFrom: string);
    var
      IniFile: TIniFile;
      Reg: TRegistry;
    begin
      BeginUpdate;
      try
        try
          if StoreType = stRegistry then
          begin
            Reg := TRegistry.Create;
            try
              SetRegistry(Reg, LoadFrom, Name);
              LoadRegistry(Reg);
            finally
              Reg.Free;
            end
          end else
          begin
            IniFile := TIniFile.Create(LoadFrom);
            try
              LoadIniFile(IniFile);
            finally
              IniFile.Free;
            end
          end;
        finally
          EndUpdate;
        end;
      except
        raise EComPort.CreateNoWinCode(CError_LoadFailed);
      end;
    end;
    @+,

    Cincap

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 294
    Points : 1 949
    Points
    1 949
    Par défaut
    Sauf que par défaut StoreSettings et StoreRegistry ne sont pas appelés.

    Essaie d'afficher les messages avec des try except, ou en débogage en incluant les sources de la ComportLib

  7. #7
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par cincap Voir le message
    Je viens d'essayer une ancienne application sous Seven 64bits, dans un dossier libre et avec droits Administrateur, le fichier Ini semble fonctionner (sauvegarde) mais à l'ouverture de l'application, les données sauvegardées ne sont pas réinscrites !
    Il y a des chances pour que ce soit l'UAC qui fasse des siennes.
    Essaie d'exécuter l'application en cochant "Executer en tant qu'administrateur" sur l'onglet compatibilité dans les propriétés de l'exe, ou lance l'appli avec "Executer en tant qu'administrateur". Si c'est l'UAC qui pose problème, avoir les droits administrateur n'est pas suffisant.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 476
    Points : 1 347
    Points
    1 347
    Par défaut
    @ Linkin, merci de ton intervention, je ne sais rien faire en mode débogage à cause du fichier manifest concernant les droits Administateurs.

    A mon avis, tu cernes le problème alors comment faire pour au lancement de la fiche utilisant uniquement l'unité Cport.pas lui permettre d'utiliser regedit.

    @+,

    Cincap

    Edit, @ Franck, l'application est bien lancée avec fichier manifest, et click droit en tant qu'administrateur.

    Si j'enlève l'unité cport.pas, le fichier ini fonctionne pour d'autres données.

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 294
    Points : 1 949
    Points
    1 949
    Par défaut
    Utilises-tu une TComComboBox? (si il n'y a pas de port com, elle provoque une exception).

    Je pense que si tu mettais du code (autour l'enregistrement et du chargement du fichier ini), ça serait plus simple .

    En tout cas, ce n'est pas normal, qu'il n'y ait pas de message qui s'affiche, soit une exception est masquée, soit un résultat de fonction n'est pas pris en compte (je ne vois rien d'auter).

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 476
    Points : 1 347
    Points
    1 347
    Par défaut
    @ Linkin, en effet, sur le pc ou se trouve Seven, il n'y a pas de carte modem donc forcément, aucun port com n'existe et j'utilise bien un TComComboBox.

    Sinon comme déjà dit, le fichier ini fonctionne bien sans utiliser l'unité cport.pas

    Néanmoins, j'ai rajouter try et finally à mon code concernant le fichier ini.

    La raison est donc connue, je cloture ce post.

    Merci à tous d'avoir répondu.

    @+,

    Cincap

  11. #11
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 294
    Points : 1 949
    Points
    1 949
    Par défaut
    Pour éviter ce problème, j'utilise une combobox normale que je remplis avec EnumComport (CPort.pas), que j'encadre avec un try except

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 476
    Points : 1 347
    Points
    1 347
    Par défaut
    Bonjour à toutes et à tous,

    @ Linkin, j'utilise maintenant un TCombobox, et j'ai indiqué dans "Items" les valeurs de Com1 à Com12 car je ne trouve pas la procédure "Enumcomport".

    Si tu avais un petit exemple !

    Merci,

    @+,

    Cincap

  13. #13
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 294
    Points : 1 949
    Points
    1 949
    Par défaut
    EnumComPorts est dans l'unité CPort, elle n'appartient à aucun objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      try
        EnumComPorts(cbxPorts.Items);
      except
        // Traitement si pas de port COM
      end;

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 476
    Points : 1 347
    Points
    1 347
    Par défaut
    @ Linkin,

    C'était bien cela, dans le traitement, il me confirme qu'il n'y a pas de matériel utilisant le port COM et donc bien entendu, mon fichier INI est bien lu avec les données enregistrées.

    Donc c'était bien l'exception qui bloquait la lecture de ce fichier INI.

    J'avais essayer ceci mais erreur Registry forcément car (seven 64 bits) :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      KeyHandle: HKEY;
      ErrCode, Index: Integer;
      ValueName, Data: string;
      ValueLen, DataLen, ValueType: DWORD;
    begin
      ErrCode := RegOpenKeyEx(
        HKEY_LOCAL_MACHINE,
        'HARDWARE\DEVICEMAP\SERIALCOMM',
        0,
        KEY_READ,
        KeyHandle);
     
      if ErrCode <> ERROR_SUCCESS then
        raise EComPort.Create(CError_RegError, ErrCode);
     
        Index := 0;
        repeat
          ValueLen := 256;
          DataLen := 256;
          SetLength(ValueName, ValueLen);
          SetLength(Data, DataLen);
          ErrCode := RegEnumValue(
            KeyHandle,
            Index,
            PChar(ValueName),
    {$IFDEF DELPHI_4_OR_HIGHER}
            Cardinal(ValueLen),
    {$ELSE}
            ValueLen,
    {$ENDIF}
            nil,
            @ValueType,
            PByte(PChar(Data)),
            @DataLen);
     
          if ErrCode = ERROR_SUCCESS then
          begin
            SetLength(Data, DataLen);
            listbox1.Items.Add(Data);//donne la liste non triée des ports presents
            listbox2.Items.Add(valuename);// donne la liste des descriptions
            Inc(Index);
          end
          else
            if ErrCode <> ERROR_NO_MORE_ITEMS then
              raise EComPort.Create(CError_RegError, ErrCode);
     
        until (ErrCode <> ERROR_SUCCESS) ;
     
        RegCloseKey(KeyHandle);
         enumcomports(listbox3.Items);// donne la liste classée des ports
    end;
    Grand merci à toi qui a cerné le problème.

    @+,

    Cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/05/2013, 17h21
  2. [CR 10] Problème lecture clé sous Seven 64bits
    Par Potus dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 17/11/2011, 11h23
  3. Réponses: 2
    Dernier message: 19/06/2010, 20h12
  4. Réponses: 5
    Dernier message: 19/05/2010, 13h47
  5. Lire un fichier .ini sous Linux
    Par cheprod dans le forum Linux
    Réponses: 2
    Dernier message: 26/04/2006, 18h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo