4

Я делаю программу, которая требует аргументов из контекстного меню (щелкните файл и вызовите мою программу с именем файла в качестве параметра).

Я пытаюсь добавить ключ реестра в команду ...\shell\myThing\. Что я хотел бы, это следующее:

C:\Program Files (x86)\Feliratozo\Feliratozo.exe %1

Я бы хотел использовать переменную окружения% ProgramFiles(x86)%, потому что я где-то читал, что она работает и в Windows x86 и x64. (Переход на "нормальные" программные файлы на x86.) Проблема возникает, когда я пытаюсь установить:

%ProgramFiles(x86)%\Feliratozo\Feliratozo.exe %1

Таким образом, когда я пытаюсь использовать указанный пункт контекстного меню, он выдает следующую ошибку:

Windows cannot access the specified device, path, or file. You may not have the appropriate permissions to access the item.

Проблема с разрешениями не кажется правильной, потому что при использовании абсолютного пути она работает.

Что я могу сделать сейчас?

3 ответа3

8

Не забудьте сделать значение реестра REG_EXPAND_SZ вместо REG_SZ. Обычно раскрываются только значения REG_EXPAND_SZ.

1

Не забывайте, что% ProgramFiles(x86)% будет расширяться пробелами в имени, поэтому пути должны быть заключены в кавычки. Он может работать так: «% ProgramFiles(x86)%\Feliratozo\Feliratozo.exe» «% 1» Кроме того, Фрэнк Томас прав, что% ProgramFiles(x86)% не работает на 32-битной Windows.

Переменные расширяются в зависимости от родительского процесса. % ProgramFiles% расширится до C:\Program Files (x86) в 64-битной установке, если вы используете 32-битную консоль или regedit (находится в SysWOW64).

Простое решение:

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\""
-1

Используйте расширяемую строку

DWORD = dword: Расширяемая строка = hex(2): Multi String = hex(7):

DWORD - это 32-разрядное целое число без знака (в диапазоне от 0 до 4294967295 десятичное). В реестре DWORD всегда начинается с 0x. В реестре DWORDS всегда имеет 8 цифр, следующих за 0x. Это может быть в десятичном или шестнадцатеричном формате, 1000 может быть записано как: 0x00001000 или 0x000003e8

DWORDS может использовать только цифры 0-9. Любые строки всегда используют ASCII, в ACSII 1000 можно записать только как 31,30,30,30. Для типа данных String ASCII работает в фоновом режиме, даже не подозревая об этом. Это связано с тем, что компьютер понимает только 1 и 0. Для типов данных Expandable String и Multi String они сохраняют ваши записи в виде серии кодов ASCII в шестнадцатеричном формате, разделенных запятыми и шестнадцатеричными нулями. Таким образом, Расширяемая строка 1000 будет: hex(2): 31,00,30,00,30,00,30,00

Итак, давайте конвертируем% PROGRAMFILES% в расширяемую строку. Сначала загрузите это: https://hotfile.com/dl/244097278/55aa086/ASCII_2_HEX_Conversion_Tool.7z.html

Теперь откройте это в любом современном браузере. Поместите% PROGRAMFILES% в поле ASCII и выберите кодировать его. Это даст вам% 25% 50% 52% 4F% 47% 52% 41% 4D% 46% 49% 4C% 45% 53% 25 Скопируйте и вставьте это в текстовый редактор, переместите первые% в конец. Выберите команду замены, найдите все "%" и замените на ", 00,". Уберите запятую в самом конце. Вы должны получить: 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 И, наконец, 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

Готово.

Вы когда-нибудь пытались преобразовать любопытную шестнадцатеричную запись в реестре в ASCII и потерпели неудачу с треском. Этот урок содержит все знания, необходимые для обратного проектирования любой записи реестра с шестнадцатеричным кодом, которая не зашифрована. Повеселись!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .