未找到可执行文件 "C:\Windows\System32\Fodhelper.exe"
Executable "C:\Windows\System32\Fodhelper.exe" not found
我正在尝试从 C++ 程序中启动上述内置 Windows 可执行文件。首先我可以确认程序确实存在,在路径“C:\Windows\System32\fodhelper.exe”
我已经尝试了 3 种不同的方法运行安装这个程序:
System()
ShellExecuteW()
CreateProcessW()
None 这些方法有效。我收到的错误是: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");
}
查看下面程序的输出:
有没有人知道我到底做错了什么?我找不到与此问题相关的任何信息。据我所知,尝试 运行 程序的代码是正确的,适用于不同的可执行文件。这也发生在三种不同的方法中。任何帮助将不胜感激。
WOW64 上的 32 位应用程序 运行 将放在 file system redirection 下。因此,如果您的应用程序是 32 位应用程序,则路径 "C:\Windows\System32\fodhelper.exe"
将被重定向到 C:\Windows\SysWOW64\fodhelper.exe
,而该路径不存在。您有一些解决方案:
- 使用
SysNative
访问真正的system32文件夹,这意味着你需要使用类似system("C:\Windows\SysNative\fodhelper.exe");
的东西
- 明确关闭文件系统重定向(通常应避免)
- 或者更好地将您的 exe 编译为 64 位应用程序。
我正在尝试从 C++ 程序中启动上述内置 Windows 可执行文件。首先我可以确认程序确实存在,在路径“C:\Windows\System32\fodhelper.exe”
我已经尝试了 3 种不同的方法运行安装这个程序:
System()
ShellExecuteW()
CreateProcessW()
None 这些方法有效。我收到的错误是: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");
}
查看下面程序的输出:
有没有人知道我到底做错了什么?我找不到与此问题相关的任何信息。据我所知,尝试 运行 程序的代码是正确的,适用于不同的可执行文件。这也发生在三种不同的方法中。任何帮助将不胜感激。
WOW64 上的 32 位应用程序 运行 将放在 file system redirection 下。因此,如果您的应用程序是 32 位应用程序,则路径 "C:\Windows\System32\fodhelper.exe"
将被重定向到 C:\Windows\SysWOW64\fodhelper.exe
,而该路径不存在。您有一些解决方案:
- 使用
SysNative
访问真正的system32文件夹,这意味着你需要使用类似system("C:\Windows\SysNative\fodhelper.exe");
的东西
- 明确关闭文件系统重定向(通常应避免)
- 或者更好地将您的 exe 编译为 64 位应用程序。