Моя система 64-битная. У меня программа вызывает команду «bcdedit.exe»
код c ++ :
ShellExecuteA(NULL, "open", "cmd.exe", "/c bcdedit.exe /?", NULL, SW_SHOWNORMAL);
Я скомпилировал в 32-битную версию. Когда я запустил ее обратно, «файл не найден» Когда я скомпилировал в 64-битную версию, запуск прошел
Та же проблема существует в коде go:
cmd := exec.Command("cmd.exe","/c","bcdedit.exe /?")
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(out))
Я нашел «bcdedit.exe» в другом каталоге:
C:\\Windows\\WinSxS\\amd64_microsoft-windows-b..iondata-cmdlinetool_31bf3856ad364e35_10.0.17134.471_none_69b0e05efb5a4702\\bcdedit.exe
Когда я вызываю команду в этом каталоге, все проходит. Этот каталог отличается на каждом ПК.
Как запустить 32-битную скомпилированную программу для этой команды на каждом ПК
почему бы вам просто не скомпилировать приложение как 64-битное? И не используйте в настоящее время API версии A. Вместо этого используйте версию W
, потому что версия A будет внутренне преобразована в W
, что было временем ЦП. — person Dean Chou schedule 29.04.2019
Почему вы вообще выполняете cmd.exe
? Вместо этого вы должны выполнять bcdedit.exe
напрямую. И для этого следует использовать CreateProcess()
, а не ShellExecute()
— person Dean Chou schedule 29.04.2019
Итак, ваш код пытается запустить
"bcdedit.exe"
. В командной строке единственным местоположениемbcdedit.exe
в среде PATH является системный каталог Windows,c:\Windows\System32
.Когда вы скомпилируете свой код как 32-битный и запустите его в 64-битной системе, ваше представление о файловой системе изменится. А именно, представление процесса
C:\Windows\System32
заменяется содержимымC:\Windows\SysWOW64
, где расположены только 32-разрядные библиотеки DLL и EXE. Однако …. В этой папке нет 32-разрядной версии bcdedit.exe. (Если вы хотите смоделировать это, запустите c: \ windows \ syswow64 \ cmd.exe — вы больше не сможете найти bcdedit.exe в папке c: \ windows \ system32).Вероятно, вам понадобится что-то вроде этого: Как получить правильный путь из system32 или SysWOW64?
Отформатируйте функцию ShellExecute, чтобы напрямую указать путь SysWow64 как для bcdedit.exe, так и для cmd.exe. Или, как предлагали другие, просто скомпилируйте для 64-разрядной версии.