2011-10-02 19 views
6

Voglio verificare se esiste una dll nella directory System32 (Windows 7). Ma anche se esiste, FileExists() restituisce false. LoadLibrary restituisce un handle valido. In questo caso, voglio solo controllare, se i file esistono e visualizzare queste informazioni. Hai qualche consiglio per risolvere questo?FileExists() restituisce false, anche se il file esiste

+0

Sto indovinando il problema dei "permessi". Vista/Windows 7 è molto protettivo nel permettere alle persone di andare in giro in \ windows :) – paulsm4

+0

@ paulsm4: No, non può essere quello. Windows ti consente sempre di scoprire se un file esiste o meno. –

risposta

21

Molto probabilmente si tratta di reindirizzamento del file. Si dispone di una macchina a 64 bit, ma dal processo 32 Delphi, Windows\system32 in realtà reindirizza a Windows\Syswow64. Quindi, quando pensi di chiedere l'esistenza di un file in Windows\system32, il sistema sta effettivamente segnalando l'esistenza (o meno) di un file in Windows\Syswow64.

Se è davvero necessario vedere nel vero sistema a 64 bit32, è necessario disabilitare il reindirizzamento dei file. Puoi farlo con la funzione Wow64DisableWow64FsRedirection(). Non dimenticare di riaccenderlo con Wow64RevertWow64FsRedirection(). Fai attenzione che disabilitare il redirector ha effetti di ampia portata e può portare a comportamenti molto strani, quindi fallo con cura.

+0

Questo è più simile. (Bene, questo e qualche errore di battitura, ovviamente ...) –

+0

Ora che ci penso, sono al 99% questo è il problema. +1, sicuramente. –

+0

Sì, probabilmente questo è il caso, in passato avevo qualcosa di simile, lo strano era che il mio comandante totale mi mostrava anche la cartella reindirizzata, dopo che qualcuno mi ha detto che è a 32 bit tutto era chiaro. (Puoi comunque disabilitare il reindirizzamento Là). Comunque ho appena controllato il sito TC, ora c'è una beta a 64 bit. – balazs

10

Non ci sono molte informazioni da seguire, il codice che si sta utilizzando potrebbe essere d'aiuto, ma potrebbe trattarsi di un problema a 64 bit e la dll si trova effettivamente nella cartella SysWOW64? Vedi here per una buona descrizione di come funziona.

+1

E un +1 anche qui, ovviamente. –

2

Quasi certamente non si specifica il percorso relativo completo o valido del file nella chiamata FileExists. LoadLibrary cercherà alcune posizioni (quelle in cui ci si aspetta che le DLL risiedano) per te, ma non lo sarà lo FileExists. Fornire il percorso completo e corretto e FileExists funzionerà correttamente.

Problemi correlati