VARIAVES DE AMBIENTE - ESTRANHO

ALEVALE 04/09/2012 14:39:10
#409133
Fala pessoal blz ?

Olha que estranho, meu sistema checa algumas variaveis de ambiente do Windows (ProgramFiles), se a máquina for X86 tranquilo, porém me deparei com a seguinte situação, quando uma máquina é X64 existem 2 variaveis de ambiente para o ProgramFiles são elas:

ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)

Eu preciso capturar o primeiro mas pegando o valor da variavel ele sempre traz a 2 (x86) eu sei que está correto mas preciso pegar o valor do primeiro só que eu não quero setar isso manualmente, alguém tem uma forma de pegar o valor das 2 ?
Se quiserem testar o que estou falando, podem dar o comando SET no DOS e verifiquem o que estou falando:

Para pegar o valor dentro do VB estou fazendo assim:

System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles

Ou
Environment.GetEnvironmentVariable([Ô]ProgramFiles[Ô])

Existe uma variavel chamada [Ô]ProgramW6432[Ô] no DOS como eu pego esse valor no VB ? Sem se assim (Environment.GetEnvironmentVariable([Ô]ProgramW6432[Ô])
OCELOT 04/09/2012 15:07:49
#409138
Resposta escolhida
Esqueça o DOS, não existe mais DOS, o que você se referiu como uma variável do DOS é uma variável de ambiente também, e você pode pega-la da mesma forma que pega a outra

Environment.GetEnvironmentVariable([Ô]ProgramW6432[Ô])

ALEVALE 04/09/2012 15:08:49
#409139
Acho que você não entendeu minha pergunta.
OCELOT 04/09/2012 15:20:40
#409140
Hum, acho que não prestei atenção no final, mas qual o motivo de você não querer pegar pela variável de ambiente? No caso deste:

System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)

Ele sempre vai retornar o valor de acordo com o como seu programa foi compilado, se ele for 32 Bits o Windows sempre vai retornar a pasta com X86, agora se ele for de 64 Bits ele vai retornar a pasta sem o X86, dependendo do caso você poderia deixar o seu programa como AnyCPU, mas isso depende um pouco do que você usa já que algumas coisas podem não funcionar em 64 Bits, de cabeça me vem o caso de usar bancos de dados do Access.
ALEVALE 04/09/2012 15:37:00
#409141
Na realidade encontrei a solução mais simples...rsrsrs
O meu sistema executa uma busca no disco procurando por arquivos suspeitos (música,videos etc), porém não procuro no diretório [Ô]Arquivos de Programas[Ô], então coloco como excessão o a variavel de ambiente (System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)) no X86 ele retorna corretamente, o problema é que no X64 existe 2 diretórios de programas o [Ô]Arquivos de Programas[Ô] e [Ô]Arquivos de Programas (X86)[Ô] pegando pelo valor da variavel do ambiente ele sempre retorna o 2 caso (X86) entendeu dai o problema, então infelizmente criei mais 1 variavel e setei o valor como [Ô]Arquivos de Programas[Ô],

Resolução final:
2 Variaveis 1 com um valor da variavel do ambiente de forma automática e outra de forma manual.

A minha dúvida é somente que em micros X64 mesmo você pegando a variavel de ambiente que deveria vir como [Ô]Program Files[Ô] ele traz ela como [Ô]Program Files (X86)[Ô], bom enfim BUG do Windows...rsr
OCELOT 04/09/2012 16:00:46
#409144
Acho que agora entendi, mas isso não é bug do windows não, e é por isso que existe essa variavel ProgramW6432

Imagine que você fez um programa de 32 Bits que acessa um arquivo na pasta Arquivos de Programas usando a variável de ambiente [Ô]ProgramFiles[Ô] para isso, um dia você resolve colocar ele no Windows de 64 Bits, o seu programa nunca foi preparado para isso, se ele for tentar acessar o arquivo na mesma pasta ele poderia acabar pegando a pasta errada (a de 64 Bits) se o Windows não mudasse o caminho para apontar pra pasta x86.

Pode testar ai, compile o programa para 64 Bits e ele retorna a pasta c:\Program Files, compilando para 32 Bits ele retorna a pasta C:\Program Files (x86), ai entra o caso do ProgramW6432, que é para programas de 32 Bits que sabem que estão rodando no Windows de 64 Bits poderem pegar o caminho do Program Files de 64 Bits.

Eu diria que não tem problema nenhum você usar o ProgramW6432, já que ele vai retornar um valor nulo (Nothing) caso o Windows seja de 32 bits então seria só você tratar isso, ou você poderia até usar o Environment.Is64BitOperatingSystem para tratar de acordo com o sistema operacional.
Tópico encerrado , respostas não são mais permitidas