帮助我了解代码中的问题
#include <Windows.h>
#include <iostream>
int main()
{
STARTUPINFO si;
::ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
::ZeroMemory(&pi, sizeof(pi));
//TCHAR cmd[] = TEXT(R"("c:\Program Files\Internet Explorer\iexplore.exe")");
TCHAR cmd[] = TEXT(R"("c:\Program Files(x86)\Windows Media Player\wmplayer.exe")");
BOOL res = ::CreateProcess(nullptr, cmd, nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);
//iexplore - run ok, wmplayer - false & getlasterror = 2
return 0;
}
我怎么了?
PS:Windows 10,Visual Studio 2017 CE,平台工具集v141
答案 0 :(得分:0)
不要硬编码系统文件夹和系统应用程序的路径。(这可能会导致在不同机器上/在不同时间出现错误或拼写错误。)
@Remy Lebeau提到,您可以使用SHGetFolderPath()
或SHGetKnownFolderPath()
来获取正确的Program Files
路径。或者,您可以从注册表中获取真实路径。
这是我们摆脱硬代码路径的另一种简单方法。 iexplore
和wmplayer
都是Windows中的应用程序。您可以在命令行(start appname
)中以“ cmd.exe
”开头,或使用如下代码:
#include <Windows.h>
#include <iostream>
int main()
{
STARTUPINFO si;
::ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
::ZeroMemory(&pi, sizeof(pi));
//TCHAR cmd[] = TEXT("cmd /c start iexplore");
TCHAR cmd[] = TEXT("cmd /c start wmplayer");
BOOL res = ::CreateProcess(NULL, cmd, nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);
return 0;
}
编辑:
或者您可以使用ShellExecute/Ex
而不用cmd
代替CreateProcess
:
ShellExecuteA(NULL,NULL, "wmplayer",NULL, NULL, SW_NORMAL);