在我的工作中,我经常使用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,如果有帮助的话。
答案 0 :(得分:1)
如果您在64位系统上创建了一个在WOW64模拟器内运行的32位应用程序,则C:\Windows\System32\
文件夹会被WOW64静默重定向到C:\Windows\SysWOW64\
文件夹,该文件夹没有msconfig.exe
文件夹1}}文件。你需要考虑到这一点。要么创建64位可执行文件,要么在WOW64内部运行的32位代码中使用Sysnative
别名。 MSDN上记录了Sysnative
:
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()
动词。