Я пытаюсь запустить указанный выше встроенный исполняемый файл Windows из программы на C++. Во-первых, я могу подтвердить, что программа существует по пути C:\Windows\System32\fodhelper.exe.
Я пробовал 3 разных метода запуска этой программы:
System()
ShellExecuteW()
CreateProcessW()
Ни один из этих методов не работает. Я получаю сообщение об ошибке: The system cannot find the file specified.
Из-за того, что я могу запустить этот исполняемый файл как моя обычная учетная запись Windows из меню «Пуск», окна «Выполнить» и из проводника Windows, я считаю, что у моей учетной записи пользователя есть права на запуск программы. Кроме того, я не получаю сообщение об отказе в доступе из своего кода. Несмотря на это, я запускал VS в качестве администратора, и у меня все еще была та же проблема.
Я считаю, что код, который я использую для запуска процесса, правильный, так как тот же самый код запустится cmd.exe
без проблем. Смотри ниже:
#include <Windows.h>
#include <tchar.h>
#include <iostream>
void CreateProcessMethod(LPCWSTR programPath) {
HRESULT result;
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInformation;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
ZeroMemory(&processInformation, sizeof(processInformation));
result = CreateProcessW(programPath, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInformation);
if (result == 0) {
wchar_t buf[256];
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
/* Display error */
std::wcout << programPath << " not started: " << buf << std::endl;
}
else {
std::wcout << programPath << " started successfuly" << std::endl;
}
}
void ShellExecuteMethod(LPCWSTR programPath) {
SHELLEXECUTEINFOW shExecInfo = { 0 };
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
shExecInfo.fMask = SEE_MASK_FLAG_NO_UI;
shExecInfo.hwnd = nullptr;
shExecInfo.lpVerb = L"open";
shExecInfo.lpFile = programPath;
shExecInfo.lpParameters = L"\\C";
shExecInfo.nShow = SW_SHOWNORMAL;
if (ShellExecuteExW(&shExecInfo) == 0)
{
if (GetLastError() != ERROR_CANCELLED) // Operation canceled by the user
{
wchar_t buf[256];
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
/* Display error */
std::wcout << programPath << " not started: " << buf << std::endl;
}
}
else {
std::wcout << programPath << " started successfuly" << std::endl;
}
}
int main(){
CreateProcessMethod(L"C:\\Windows\\System32\\cmd.exe");
CreateProcessMethod(L"C:\\Windows\\System32\\fodhelper.exe");
ShellExecuteMethod(L"C:\\Windows\\System32\\cmd.exe");
ShellExecuteMethod(L"C:\\Windows\\System32\\fodhelper.exe");
}
См. вывод программы ниже:
Кто-нибудь знает, что именно я здесь делаю неправильно? Не могу найти никакой информации по этому вопросу. Насколько я понимаю, код, пытающийся запустить программу, правильный, работает с разными исполняемыми файлами. Это также происходит с тремя различными методами. Любая помощь будет принята с благодарностью.