c++ - 我想通过 GUI 上的按钮打开 Msconfig

标签 c++ windows winapi

在我的工作中,我经常使用 msconfig,我想创建一个带有各种按钮的工具,以便我可以轻松访问我最常用的程序。我正在使用 Win32API 创建 GUI 和按钮,但是我无法运行 msconfig。在我的程序中我有

void callMsconfig()
{
ShellExecute(NULL,(LPCWSTR)L"open", (LPCWSTR)L"C:\\Windows\\System32\\msconfig.exe", NULL, NULL, SW_SHOWDEFAULT);
}

和一个 Action 语句,所以当按下按钮时调用该函数。我试过用 system() 和 CreateProcess() 替换 ShellExecute()。我还用“runas”替换了“open”,我得到的最多的是错误说 C:\Windows\System32\msconfig.exe cannot be found 当我知道它在那里时,因为我已经检查过了。我究竟做错了什么?如果有帮助,我正在使用 Windows 10 家庭版。

最佳答案

如果您创建了一个在 64 位系统上的 WOW64 模拟器内部运行的 32 位应用程序,则 C:\Windows\System32\ 文件夹会被 WOW64 静默重定向到 C:\Windows\SysWOW64\ 文件夹,其中没有 msconfig.exe 文件。你需要考虑到这一点。创建 64 位可执行文件,或在 WOW64 内部运行的 32 位代码中使用 Sysnative 别名。 Sysnative 记录在 MSDN 上:

File System Redirector :

32-bit applications can access the native system directory by substituting %windir%\Sysnative for %windir%\System32. WOW64 recognizes Sysnative as a special alias used to indicate that the file system should not redirect the access. This mechanism is flexible and easy to use, therefore, it is the recommended mechanism to bypass file system redirection. Note that 64-bit applications cannot use the Sysnative alias as it is a virtual directory not a real one.

尝试更像这样的东西:

#include <shlwapi.h>

void callMsconfig()
{
    BOOL IsWow64 = FALSE;
    WCHAR szCmdLine[MAX_PATH] = {0};

    IsWow64Process(GetCurrentProcess(), &IsWow64);
    if (IsWow64)
    {
        GetWindowsDirectoryW(szCmdLine, MAX_PATH);
        PathAppendW(szCmdLine, L"Sysnative");
    }
    else
    {
        GetSystemDirectoryW(szCmdLine, MAX_PATH);
    }
    PathAppendW(szCmdLine, L"msconfig.exe");

    ShellExecuteW(NULL, NULL, szCmdLine, NULL, NULL, SW_SHOWDEFAULT);
}

但是,请注意,如果启用了 UAC 并且您尝试从运行在 WOW64 内部的 32 位进程启动 msconfig.exe,则 32 位进程必须以提升的方式运行,否则 ShellExecute( )(和 CreateProcess())将无法正确找到文件。我不知道为什么,但这就是它的工作原理。从 64 位进程启动 msconfig.exe 时不需要 UAC 提升。

如果您不想提升整个程序,则必须让它启动一个单独的提升进程,然后才能启动 msconfig.exe。您可以让程序使用命令行参数启动其自身的第二个拷贝,这样它就知道只需启动 msconfig.exe 然后自行退出。要启动提升的进程,您可以使用 ShellExecute() 指定 runas 动词。

关于c++ - 我想通过 GUI 上的按钮打开 Msconfig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33380924/

相关文章:

java - 来自 Java 的 Qt Android : How to call Toast. makeText?

c++ - 如何以多态方式使用替代类型的 std::variant

c - Win32 快捷菜单在任何情况下都不发送消息

php - 在 Windows XP 中是否可以获取由 exec() 启动的进程的 PID?

windows - 如何避免在 cmd.exe 上弹出命令窗口

c - 使用 ReadFile 读取整个 PhysicalDrive 内容

c++ - 检查窗口是否失去焦点

c++ - OpenGL 渲染错误

c++ - 在 C++11 中有选择地禁用模板成员的简单方法

windows - Win7 和 Win XP 关机前运行程序