Você deve se lembrar de tornar o valor do Registro um REG_EXPAND_SZ em vez de um REG_SZ. Normalmente, apenas os valores REG_EXPAND_SZ são expandidos.
Estou fazendo um programa que requer argumentos do menu de contexto (clique em um arquivo e chame meu programa com o nome do arquivo como parâmetro).
Estou tentando adicionar uma chave de registro ao comando ... \ shell \ myThing \. O que eu gostaria é o seguinte:
C:\Program Files (x86)\Feliratozo\Feliratozo.exe %1
Gostaria de usar a variável de ambiente% ProgramFiles (x86)%, porque li em algum lugar que ela também funciona em x86 e x64 Windows. (Mudando para Arquivos de Programa "normais" no x86) O problema surge quando tento definir:
%ProgramFiles(x86)%\Feliratozo\Feliratozo.exe %1
Dessa forma, quando tento usar o item de menu de contexto, ele apresenta o seguinte erro:
Windows cannot access the specified device, path, or file. You may not have the appropriate permissions to access the item.
O problema de permissão não parece estar correto porque, ao usar o caminho absoluto, ele funciona.
O que posso fazer agora?
Não se esqueça que% ProgramFiles (x86)% será expandido com espaços no nome, portanto, o caminho (s) precisa ser colocado entre aspas. Pode funcionar como: "% ProgramFiles (x86)% \ Feliratozo \ Feliratozo.exe" "% 1" Além disso, Frank Thomas está correto sobre% ProgramFiles (x86)% não está funcionando no Windows de 32 bits.
As variáveis são expandidas com base no processo pai. % ProgramFiles% expandirá para C: \ Program Files (x86) em uma instalação de 64 bits se você usar o console de 32 bits ou o regedit (localizado no SysWOW64).
Uma solução simples:
Install.cmd:
IF EXIST %WinDIR%\SysWOW64\regedit.exe (
%WinDIR%\SysWOW64\regedit.exe /s Install.reg
) ELSE (
%WinDIR%\regedit.exe /s Install.reg
)
Install.reg:
Windows Registry Editor Version 5.00
[...\shell\myThing\command]
@="\"%ProgramFiles%\Feliratozo\Feliratozo.exe\" \"%1\""
Use uma string expansível
DWORD = dword: String expansível = hex (2): Multi String = hex (7):
Um DWORD é um inteiro não assinado de 32 bits (intervalo: 0 a 4294967295 decimal) No registro, um DWORD sempre começa com 0x. No registro, DWORDS sempre tem 8 dígitos que seguem 0x. Isso pode ser em formato decimal ou hexadecimal, 1000 pode ser escrito como: 0x00001000 ou 0x000003e8
DWORDS só pode usar os dígitos 0-9. Strings, de qualquer tipo, sempre usam ASCII, no ACSII 1000 só pode ser escrito como 31,30,30,30 Para o tipo de dados String, o ASCII funciona em segundo plano sem que você saiba. Tem que porque o computador só entende 1s e 0s. Para os tipos de dados Expansível String e Multi String, eles salvam suas entradas como uma série de códigos ASCII em um formato hexadecimal, separados por vírgulas e zeros hexadecimais. Então, uma string expansível de 1000 seria: hex (2): 31,00,30,00,30,00,30,00
Então, vamos converter% PROGRAMFILES% em uma string expansível. Primeiro, faça o download: link
Agora abra isso em qualquer navegador moderno. Coloque% PROGRAMFILES% na caixa ASCII e selecione codificar. Ele vai te dar% 25% 50% 52% 4F% 47% 52% 41% 4D% 46% 49% 4C% 45% 53% 25 Copie e cole em um editor de texto, mova o primeiro% até o fim. Selecione o comando replace, localize todos os "%" e substitua por ", 00". Remova a vírgula no final. Você deve obter: 25,00,50,00,52,00,4F, 00,47,00,52,00,41,00,4D, 00,46,00,49,00,4C, 00,45, 00,53,00,25,00 E finalmente, hex (2): 25,00,50,00,52,00,4F, 00,47,00,52,00,41,00,4D, 00,46 00,49,00,4C, 00,45,00,53,00,25,00
Feito.
Você já tentou converter uma entrada de registro hexadecimal curiosa em ASCII e falhou miseravelmente. Esta lição contém todo o conhecimento necessário para fazer engenharia reversa de qualquer entrada de registro com código hexadecimal que não esteja criptografada. Divirta-se!