2011-10-02 5 views
6

Je veux vérifier si une DLL dans le répertoire System32 (Windows 7) existe. Mais même s'il existe, FileExists() renvoie false. LoadLibrary renvoie un handle valide. Dans ce cas, je veux seulement vérifier, si les fichiers existent et visualiser cette information. Avez-vous des conseils pour résoudre ce problème?FileExists() renvoie la valeur false, même si le fichier existe

+0

Je devine le problème des "permissions". Vista/Windows 7 est très protecteur sur le fait de laisser les gens bouger dans \ windows :) – paulsm4

+0

@ paulsm4: Non, ça ne peut pas être ça. Windows vous permet toujours de savoir si un fichier existe ou non. –

Répondre

21

Il s'agit probablement d'une redirection de fichier. Vous avez une machine 64 bits mais à partir du processus 32 Delphi, Windows\system32 redirige actuellement vers Windows\Syswow64. Donc, quand vous pensez que vous demandez l'existence d'un fichier dans Windows\system32, le système signale réellement l'existence (ou pas) d'un fichier dans Windows\Syswow64.

Si vous avez vraiment besoin de voir dans le vrai 64 bits system32 alors vous devez désactiver la redirection de fichiers. Vous pouvez le faire avec la fonction Wow64DisableWow64FsRedirection(). Ne pas oublier de le rallumer avec Wow64RevertWow64FsRedirection(). Méfiez-vous que la désactivation du redirecteur a des effets étendus et peut entraîner un comportement très étrange, faites-le avec précaution.

+0

Cela ressemble plus à ça. (Eh bien, ceci et une faute de frappe, bien sûr ...) –

+0

Maintenant que j'y pense, je suis 99% c'est le problème. +1, définitivement. –

+0

Oui, probablement c'est le cas, dans le passé j'avais quelque chose de similaire, l'étrange était que mon commandant total m'a montré le dossier redirigé aussi, après quelqu'un m'a dit que c'est 32 bits tout était clair. (Vous pouvez toujours désactiver la redirection Là). Quoi qu'il en soit, il suffit de vérifier le site de TC, maintenant il y a une version bêta 64 bits. – balazs

10

Pas beaucoup d'informations pour continuer, le code que vous utilisez peut-être aider, mais cela pourrait-il être un problème de 64 bits et que la DLL est réellement dans le dossier SysWOW64? Voir here pour une bonne description de la façon dont cela fonctionne.

+1

Et un +1 ici aussi, bien sûr. –

2

Vous ne spécifiez certainement pas le chemin d'accès relatif complet ou valide du fichier dans votre appel FileExists. LoadLibrary recherchera certains emplacements (ceux où les DLL doivent résider) pour vous, mais pas FileExists. Fournir le chemin complet et correct et FileExists fonctionnera correctement.

Questions connexes