Компиляция 32-битных программ и вызов 64-битных программ в 64-битных системах

Моя система 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

См. также:  Ошибка получения Kubernetes: неавторизовано при попытке настроить GitLab CI Runner с Kubernetes
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Dean Chou

    Итак, ваш код пытается запустить "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-разрядной версии.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: