2010-02-01 4 views
3

J'ai erreur si je ne cours pas mon programme « en tant qu'administrateur » violation d'accès ... dans le module ... etc ...droits d'administrateur demande

Got erreur lorsque vous essayez travailler avec mon fichier ini. Comment éviter une erreur ou faire une demande Droits d'administrateur.

(en C++ Builder6, mais le code Delphi est lisible pour moi aussi)

travaillant avec ini par défaut

TIniFile *FormCllient; 
     FormCllient = new TIniFile(ExtractFilePath(Application->ExeName)+"Inf\\MyIniFile.ini"); 
... 

Ajouté:

Je pense que je dois ajouter des règles pour le dossier après l'application d'installation Je fais le pack d'installation avec Inno Setup ... J'espère que c'est réel.

***** Ajouté: *****

Comment mettre mon fichier dans les données d'applications?

Répondre

2

Voici une fonction que j'ai écrite pour obtenir le dossier Application Data dans C++ Builder.

Si vous utilisez les anciennes versions de C++ Builder, vous pouvez vous trouver devez changer cette option pour utiliser AnsiStrings au lieu d'Unicode (remplacer les "UnicodeString « s avec » AnsiString « s, et changer l'appel à » SHGetSpecialFolderPathW "pour lire" SHGetSpecialFolderPath ").

GetAppDataFolder.h:

#ifndef GetAppDataFolderH 
#define GetAppDataFolderH 

UnicodeString GetAppDataFolder(bool roaming = true); 

#endif 

GetAppDataFolder.cpp:

// Helper function to get the location of the current user's Application Data folder (used for 
// storing per-user application settings). 

#include <vcl.h> 
#pragma hdrstop 


/* roaming: True for application data that can be accessed by the same user on different 
       machines. If you have per-user settings that are only relevant to a particular 
       computer, e.g., screen resolution, set 'roaming' to false. 
*/ 
UnicodeString GetAppDataFolder(bool roaming /* = true */) 
{ 
    UnicodeString retVal; 
    int csidl = roaming ? CSIDL_APPDATA : CSIDL_LOCAL_APPDATA; 
    wchar_t thePath[MAX_PATH]; 
    if (SHGetSpecialFolderPathW(NULL, thePath, csidl, 0) == TRUE) { 
     retVal = thePath; 
    } 
    return retVal; 
} 
+0

merci, ce code m'a vraiment aidé. – Cynede

0

Essayez de le coder en dur, la violation d'accès vient probablement de demander au système des informations sur un fichier que l'utilisateur peut ou non avoir des permissions à connaître. Si vous avez besoin d'une solution plus dynamique essayez d'utiliser une variable d'environnement qui se réfère à l'emplacement du fichier ou du dossier "home" des utilisateurs

+0

Je pense que j'ai besoin de déplacer mon fichier ini vers {localappdata} Le chemin vers le dossier Application Data (non-root) local. – Cynede

+0

-1 Les noms de chemins codés en dur ne sont pas une bonne idée. –

3

Ne placez pas le fichier ini le long de l'application/sauf si vous avez vraiment besoin de /. L'utilisateur commun, même l'administrateur/lorsque l'application n'est pas explicitement élevée/n'a pas le droit d'écrire dans le dossier Program Files. Utilisez l'environnement var% ProgramData% si vous voulez écrire l'ini accessible pour tous les utilisateurs, et utilisez env var% USERPROFILE% \ AppData \ Roaming si vous voulez écrire des données spécifiques à l'utilisateur accessibles uniquement par l'utilisateur actuel. Vous pouvez également utiliser "SHGetFolderPath" pour obtenir ces dossiers via API.

+0

merci beaucoup mutch :) – Cynede

+1

"% USERPROFILE% \ AppData \ Roaming" fonctionnera un peu moche dans WinXP. SHGetFolderPath est beaucoup mieux. – Torbins

0

Les raisons pour/contre le stockage de votre configuration d'application dans le Registre? Je ne vous suggère pas de refaire le code qui a soulevé la question, juste curieux pour mes futurs projets.

Questions connexes