2010-02-09 9 views
3

Lors du test de nos applications, nous avons constaté qu'en utilisant ShGetFolderPath pour renvoyer le chemin AppData, la fonction renvoie zéro même si le dossier existe sur un PC de test. Sur le développement PC ShGetFolderPath renvoie le chemin AppData sans erreur.Pourquoi ShGetFolderPath retourne-t-il quand le dossier existe sur certains PC Vista?

Le PC de développement et le PC de test exécutent Vista.

function GetShellFolder(ID: Cardinal; Create: Boolean = False): string; 
// This function is a superset of SHGetSpecialFolderPath, included with 
// earlier versions of the Shell. On systems preceeding those including 
// Shell32.dll version 5.0 (Windows Millennium Edition (Windows Me) and 
// Windows 2000), SHGetFolderPath was obtained through SHFolder.dll, 
// distributed with Microsoft Internet Explorer 4.0 and later versions. 

// Takes the CSIDL of a folder and returns the path or 'Could not determine 
// folder path' if it does not exist. Creates the folder if it does not 
// exist if Create is true. 
var 
    Res: HResult; 
    Path: array [ 0 .. Max_Path ] of Char; 
begin 
    if Create then 
    ID := ID or csidl_Flag_Create; 
    Res := ShGetFolderPath(0, ID, 0, shgfp_Type_Current, Path); 
    if S_OK <> Res then 
    begin 
    Result := 'Could not determine folder path'; 
    raise Exception.Create('Could not determine folder path'); 
    end; 
    Result := Path; 
end; 

GetShellFolder(CSIDL_LOCAL_APPDATA, False); 

Sur la machine de développement le chemin CSIDL_LOCAL_APPDATA est retourné avec succès, mais sur un PC de test le dossier CSIDL_LOCAL_APPDATA n'est pas retourné.

Est-ce que quelqu'un sait pourquoi le dossier CSIDL_LOCAL_APPDATA n'est pas retourné sur le PC de test même si le dossier existe sur le disque dur? L'ordinateur de test renvoie le dossier d'historique avec CSIDL_HISTORY, mais il ne renvoie pas le dossier appdata local avec CSIDL_LOCAL_APPDATA.

Sur l'explorateur de PC de test affiche le dossier CSIDL_LOCAL_APPDATA en tant qu'utilisateurs \ user \ AppData \ Local. Sur l'explorateur de PC de test affiche le dossier CSIDL_HISTORY en tant qu'utilisateurs \ utilisateur \ AppData \ Local \ Microsoft \ Windows \ History.

si nous appelons GetShellFolder (CSIDL_LOCAL_APPDATA, True), la fonction ne retourne toujours pas le chemin du dossier. Que dois-je faire de mal ou comment puis-je résoudre ce problème?

+2

Votre fonction ne retourne pas 'Impossible de déterminer le chemin du dossier'. Lorsqu'une fonction déclenche une exception, il n'y a pas de valeur de retour *. Vous vérifiez le résultat pour 'S_OK', mais vous ne tenez pas compte des autres valeurs de retour possibles, telles que' S_False', 'E_Fail' et' E_InvalidArg'. Lorsque ShGetFolderPath échoue, il devrait vous dire pourquoi. N'ignorez pas cette information. Une autre chose: votre programme est un service, ou est-il en cours d'exécution avec des privilèges élevés? –

+0

C'est une application normale sans privilèges élevés. – Bill

+2

Pourquoi coder les codes d'erreur au lieu d'utiliser RaiseLastOSError? Vous obtiendrez des messages d'erreur plus utiles, localisés ainsi que le code d'erreur –

Répondre

2

Quelques informations supplémentaires peuvent être utiles: 1. quelle version de delphi (unicode ou ansi) 2. l'exception est-elle levée ou non? Si c'est le cas, quel est le résultat exact de l'appel shGetFolderPat? appel (nous maintenant ce n'est pas S_OK, mais c'est quoi?)

En ce qui concerne la réponse réelle, selon les spécifications, PATH-devrait être une chaîne terminée par zéro de longueur MAX_PATH. Actuellement, il n'est pas initialisé du tout (variable locale), ce qui pourrait expliquer la différence entre les deux machines. Vous voudrez peut-être essayer de le remplir à zéro en premier. Long shot, je l'admets.

+0

La version Delphi est Delphi 2010. – Bill

+0

J'ai changé la fonction pour retourner tous les codes HRESULT standard ainsi que le HResult. Dans l'ordinateur de test qui échoue, un code d'erreur -2147024891 est renvoyé. – Bill

+3

Ce code d'erreur, 0x80070005, signifie E_ACCESSDENIED. Considérant ceci, vous pourriez trouver http://bit.ly/9MEp7x utile. –

Questions connexes