Come può applicazione a 32 bit trovare la posizione di directory Programmi a 64 bit su Windows Vista a 64 bit?

StackOverflow https://stackoverflow.com/questions/1958881

  •  21-09-2019
  •  | 
  •  

Domanda

Sono alle prese con un problema di come determinare la posizione della directory Programmi a 64 bit a 64 bit di Windows Vista da un'applicazione a 32 bit.

Le chiamate a SHGetKnownFolderPath(FOLDERID_ProgramFilesX64) non restituiscono nulla. Il MSDN articolo KNOWNFOLDERID afferma anche che questo particolare chiamata con FOLDERID_ProgramFilesX64 non è supportata per un'applicazione a 32 bit .

Vorrei evitare il più possibile hardcoding il percorso "C: \ Programmi". Fare qualcosa di simile GetWindowsDirectory(), estrarre l'unità dal valore di ritorno e aggiungendo "\ Programmi" ad esso non è attraente sia.

Come può un applicazione a 32 bit correttamente ottenere la posizione della cartella da 64-bit di Windows Vista?

Sfondo

La nostra applicazione ha un componente di servizio che dovrebbe lanciare altri processi basati su richieste da componente specifico user-session. Le applicazioni possono essere lanciate a 32-bit o 64-bit. Facciamo questo è via CreateProcessAsUser() passando un token di avviare processo utente-sessione. Per chiamata CreateProcessAsUser, creiamo un blocco di ambiente tramite l'API CreateEnvironmentBlock(). Il problema è che CreateEnvironmentBlock(), utilizzando il token dell'applicazione user-session, crea un blocco con ProgramW6432 = "C: \ Program Files (x86)", che è un problema per le applicazioni a 64 bit. Abbiamo bisogno di sostituire con il valore corretto.

È stato utile?

Soluzione

Come lei ha ricordato, utilizzando SHGetKnownFolderPath da un'applicazione a 32 bit non funziona su un sistema operativo a 64 bit. Questo perché l'emulazione Wow64 è a tutti gli effetti.

È possibile comunque utilizzare RegOpenKeyEx passando il KEY_WOW64_64KEY bandiera e poi leggere la directory dei file di programma dal registro di sistema.

La posizione nel Registro di sistema:

  

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion

Siete interessati al valore stringa:

  

ProgramFilesDir

Altri suggerimenti

Se si legge la pagina con attenzione, vedrete che FOLDERID_ProgramFilesX64 è supportato per le applicazioni a 32 bit su un sistema operativo a 64 bit. Non è supportato su un sistema operativo a 32 bit, che ha un senso completo.

  

FOLDERID_ProgramFilesX64 è supportato ...

MSDN dice che è supportato, ma documento "WOW64" best practice di Microsoft dice che non è. Vedere http: // scaricare .microsoft.com / download / A / F / 7 / AF7777E5-7DCD-4800-8A0A-B18336565F5B / wow64_bestprac.docx

Per citare:

  

• Alcune variabili funzionano solo se il processo è a 64 bit.   Ad esempio, FOLDERID_ProgramFilesX64 non funziona per i chiamanti a 32 bit. Nelle versioni di Windows precedenti a Windows 7,% ProgramW6432% non ha funzionato nel contesto dei processi a 32 bit. Un'applicazione deve determinare se è in esecuzione in un processo a 64 bit prima che utilizza queste variabili.

In Windows 7 x64, l'esecuzione di un 32 bit app nel debugger di Visual Studio, ho anche ottenere un codice di ritorno di 0x80070002 (e un puntatore NULL). Esegue lo stesso codice compilato da 64 bit restituisce il valore di S_OK e il percorso sia correttamente compilato.

Ho usato il Registro di incidere come elencato sopra in quanto non riesco a trovare qualsiasi altra soluzione.

È anche possibile interrogare il ProgramW6432 variabile d'ambiente. Esiste ovviamente solo in Windows a 64 bit, ma dovrebbe tornare il vero directory Programmi a 64 bit, e sembra essere definito per entrambi i programmi a 64-bit e 32-bit. Almeno ha funzionato per me (C #, GetEnvironmentVariable) ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top