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 :

Migration delphi 7 vers Delphi 10.1 : pb avec TIniFile


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut Migration delphi 7 vers Delphi 10.1 : pb avec TIniFile
    Bonjour,

    J'ai commencé à migrer un petit projet perso diffuser gratuitement sur le net pour changer d'EDI : passage de Delphi 7 à Delphi 10.1.

    J'ai passé les erreurs de compilation dues aux évolutions du compilateur. Maintenant ça compile.

    Le problème suivant apparait au lancement de l'application, lorsqu'elle a besoin d'accéder à son fichier .ini.

    Mon appli peut être installée via un installateur (construit avec Innosetup), ou via la décompression d'un zip. Dans le premier cas le fichier ini est déposé dans {commonappdata}\monAppli, commonappdata correspondant à C:\ProgramData\monAppli\monAppli.ini

    Dans le 2° cas, le fichier ini est dans le répertoire de l'appli

    Au lancement, mon appli test la présence d'un fichier ini dans commonappdata, s'il le trouve il l'utilise. Ou plutôt, je croyais qu'il l'utilisait

    En changeant de compilateur, j'ai un plantage lors de la première écriture dans le fichier (impossible d'écrire), alors que la lecture se passe bien. Je debug, et constate que les valeurs lues ne sont pas conformes à ce que j'attendais. Après recherche, voilà ce que j'ai trouvé : mon appli utilise CSIDL_COMMON_APPDATA. Le debuger delphi 7 m'indique bien qu'il s'agit du chemin C:\ProgramData\monAppli\monAppli.ini, et pourtant il ne lit pas la bonne valeur.
    Dans les fait, il me créé un fichier à cet emplacement : C:\Users\<account>\AppData\Local\VirtualStore\Program Files\monAppli\monAppli.ini

    Le debuger Delphi 10.1 m'indique la même chose (C:\ProgramData\monAppli\monAppli.ini), mais à la différence qu'il utilise réellement ce fichier, et là problème : la lecture du fichier se passe bien, mais l'écriture provoque une exception disant que l'écriture est impossible. Le fichier n'est pas en lecture seule. Par contre je ne peux pas le modifier, même avec Notepad, et je ne comprends pas pourquoi...

    Quelqu'un saurait m'expliquer ces comportements et commun coder quelque chose de propre en assurant la compatibilité ascendante pour mes utilisateurs ?

    Merci pour votre aide !

  2. #2
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    et avec System.IOUtils.TPath ça n'irait pas mieux ?

  3. #3
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Je ne le connais pas celui là...

    Par contre je suis en train de faire des recherches : certains site recommande CSIDL_COMMON_APPDATA, et la FAQ Delphi ne le cite pas et ne parle que de CSIDL_APPDATA. J'ai testé ce dernier, et là ça m'envoie dans C:\Users\<account>\AppData\Roaming\monAppli...

    Edit : j'ai testé mon code avec CSIDL_APPDATA, et là mon appli a les droits de lecture et d'écriture. Si je ne trouve pas plus d'explication je modifierai le script innosetup et je chercherai une solution pour déplacer le fichier de config des utilisateurs lors de l'installation du patch...

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    C'est l'absence de manifest dans les projets D7 qui provoque la redirection vers VirtualStore, le but étant justement d'assurer une compatibilité avec les anciennes applications.

    Les Delphi plus récents intègrent ce manifest, il n'y a donc plus de redirection. Par contre, l'UAC limite les possibilités d'écriture sous Program files aux seuls administrateurs.

    Il faut revoir le concept de ton application, travailler avec des valeurs par défaut à la place de dézipper l'ini et le créer au besoin (en cas de changement) sous ProgramData (ou AppData).

    ProgramData est commun à tous les utilisateurs, AppData est par utilisateur.

  5. #5
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Bonjour,

    J'en étais arrivé aux mêmes conclusion. Il se trouve que mon appli a déjà un fichier d'installation, et exploit commappdata dans innosetup pour les fichiers de config (et donc le répertoire ProgramData ).

    Le problème c'est que ni mon programme compilé avec Delphi 10.1, ni notepad, ne pouvons écrire dans ce fichier :/

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Citation Envoyé par declencher Voir le message
    Le problème c'est que ni mon programme compilé avec Delphi 10.1, ni notepad, ne pouvons écrire dans ce fichier :/
    Donne des droits en écriture sur ce répertoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [Dirs]
    Name: {commonappdata}\MonAppli; Permissions: users-modify

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par declencher Voir le message
    Le debuger Delphi 10.1 m'indique la même chose (C:\ProgramData\monAppli\monAppli.ini), mais à la différence qu'il utilise réellement ce fichier, et là problème : la lecture du fichier se passe bien, mais l'écriture provoque une exception disant que l'écriture est impossible. Le fichier n'est pas en lecture seule. Par contre je ne peux pas le modifier, même avec Notepad, et je ne comprends pas pourquoi...
    Quelqu'un saurait m'expliquer ces comportements et commun coder quelque chose de propre en assurant la compatibilité ascendante pour mes utilisateurs ?
    la faute à l'UAC (user account control) de Windows Vista et + . Pour modifier avec Notepad il faut lancer Notepad en mode administrateur

    et avec System.IOUtils.TPath ça n'irait pas mieux ?
    TPath encapsule un certain nombre de méthode pour obtenir les répertoires les plus "communs"
    i.e.
    W10
    Tpath.GetSharedDocumentsPath C:\Users\Public\Documents
    Tpath.GetDocumentsPath C:\Users\SergioMaster\Documents
    Tpath.GetPublicPath C:\ProgramData
    Tpath.GetHomePath C:\Users\SergioMaster\AppData\Roaming
    mais aussi des méthodes pour combiner des parties de répertoire
    i.e TPath.Combine(TPath.Combine(Tpath.GetPublicPath,'monappli'), 'mon.ini');

    pour en finir
    d'après l'aide CSIDL_COMMON_APPDATA correspond à GetPublicpath
    CSIDL_APPDATA GetHomePath

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

Discussions similaires

  1. Probleme de migration Delphi/Access vers Delphi/SQL Server
    Par burkan dans le forum Bases de données
    Réponses: 6
    Dernier message: 26/01/2011, 18h05
  2. Migration Delphi Win32 vers Delphi .NET
    Par ddr_xp68 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/04/2009, 12h52
  3. Migration Delphi-Access vers Delphi-SQL Server
    Par burkan dans le forum Bases de données
    Réponses: 5
    Dernier message: 05/05/2008, 03h31
  4. Réponses: 11
    Dernier message: 15/01/2008, 13h28
  5. Réponses: 3
    Dernier message: 05/10/2005, 17h19

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