C++:Windows下调用ShellExecute返回42,无法打开URL网址的问题
C++:Windows下调用ShellExecute返回42,无法打开URL网址的问题
实际上,很多程序都遇到过这样的问题,各类程序的处理方法各式各样,但大多未找到问题的根源。
一般情况下,使用 dwRet = ShellExecute(NULL, _T(“open”), url, NULL, NULL, SW_SHOWNORMAL); 并判断返回值是否大于32,是则认为成功。这个调用的是默认浏览器。
但部分情况下,返回值确实会小于32,此时执行dwRet = ShellExecute(NULL, _T(“open”), _T(“iexplore.exe”), url, NULL, SW_SHOWNORMAL); 一般都会成功,因为iexplore.exe是windows自带的,即使卸载掉,一般也只是隐藏了文件,实际还是存在在系统中。而windows 10下调用iexplore.exe将直接调用edge,所以,此调用成功率非常高。但缺点就是,并没有使用默认浏览器,给用户的感觉并不好。
部分拥有浏览器产品的公司产品,会优先调用自己旗下的浏览器打开网页。这种情况就忽略了。
以上是大部分软件的做法,成功率也较高。但不少情况下,调用ShellExecute(NULL, _T(“open”), url, NULL, NULL, SW_SHOWNORMAL); 返回了42,也就是调用成功,但是并没有打开浏览器网页。对此,不少人提出了自己的解法。比如使用ShellExecuteEx代替;先查询注册表获取默认浏览器的路径,再调用CreateProcess启动浏览器打开网址;等等。
本人也按这些方法一一试过,几乎都不行。考虑到返回值为42,说明调用成功,于是将电脑上已经打开的chrome浏览器关闭,再调用,发现成功打开了网页。这说明,调用始终是成功的,问题在于chrome浏览器并没有处理新的打开请求,或者说,根本没有收到新的打开网页请求。于是,推测是UAC所致。因此得到如下两种解决方法:
方法一:直接使用桌面去打开
ShellExecute(NULL, _T("open"), _T("explorer.exe"), url, NULL, SW_SHOWNORMAL);
方法二:
std::wstring commandline;
commandline += _T("cmd /c start \"\"");
commandline += _T(" \"");
commandline += url;
commandline += _T("\"");
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!::CreateProcess(
nullptr,
(TCHAR*)commandline.c_str(),
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW,
NULL,
NULL,
&si,
&pi))
{
dwRet = ShellExecute(NULL, _T("open"), _T("iexplore.exe"), url, NULL, SW_SHOWNORMAL);
ASSERT(dwRet > (HINSTANCE)32);
if (dwRet <= (HINSTANCE)32)
{
return FALSE;
}
}
else
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
转载请注明来源,谢谢。
有偿解决C++编程问题,承接项目定制开发;寻一份全职或兼职Windows C++开发工作。联系邮箱:[email protected]。