Usando a variável Environment no registro para o comando

3

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?

    
por Martin Fejes 23.05.2013 / 13:52

3 respostas

7

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.

    
por 23.05.2013 / 15:18
1

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\""
    
por 27.03.2015 / 12:09
-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!

    
por 08.09.2013 / 23:30