我想从GUI上的按钮打开Msconfig

时间:2015-10-28 00:32:47

标签: 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);
}

和一个动作声明,所以按下按钮时会调用该函数。我尝试用system()和CreateProcess()替换ShellExecute()。我也取代了" open"用" runas"我得到的最多的是C:\ Windows \ System32 \ msconfig.exe在我知道它存在时找不到的错误因为我已经检查过了。我究竟做错了什么?我使用的是Windows 10 Home,如果有帮助的话。

1 个答案:

答案 0 :(得分:1)

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

File System Redirector

  

32位应用程序可以通过将%windir%\Sysnative替换为%windir%\System32来访问本机系统目录。 WOW64将Sysnative识别为一个特殊别名,用于指示文件系统不应重定向访问。此机制灵活且易于使用,因此,它是推荐的绕过文件系统重定向的机制。请注意,64位应用程序不能使用Sysnative别名,因为它是虚拟目录而不是真实目录。

尝试更像这样的事情:

#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()(和{{1 }}将无法正确找到文件。我不知道为什么,但这就是它的工作原理。从64位进程启动CreateProcess()时不需要UAC提升。

如果您不想提升整个程序,则必须启动一个单独的提升流程,然后启动msconfig.exe。您可以让程序使用命令行参数启动自身的第二个副本,以便它知道只需启动msconfig.exe然后退出自己。要启动提升的流程,您可以使用msconfig.exe指定ShellExecute()动词。