如何从 C++ 代码中使用特定 URL 启动 Microsoft Edge
How to start Microsoft Edge with specific URL from C++ code
我尝试了 Launching Microsoft Edge with URL from code and 中的解决方案,但它们对我不起作用。
这是我的代码:
std::string url = "http://www.test.com";
std::wstring quotedArg = L"microsoft-edge:\"" + url + L"\"";
std::vector<WCHAR> argBuff(quotedArg.w_size() + 1);
wcscpy_s(&argBuff[0], argBuff.size(), quotedArg.w_str());
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof si;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
if (!CreateProcess(L"start", &argBuff[0], NULL, NULL, FALSE,
0, NULL, NULL, &si, &pi)) {
DWORD error = GetLastError(); // here error = 2
return false;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CreateProcess()
后的错误码为2,在https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382%28v=vs.85%29.aspx中代表ERROR_FILE_NOT_FOUND
。
更新一:
对于 Dúthomhas 的问题:
我没有将用户与 Edge 绑定。我使用 ShellExecuteEx()
打开 http/https URL 如下片段。
SHELLEXECUTEINFO sei = { };
sei.cbSize = sizeof sei;
sei.nShow = SW_SHOWNORMAL;
sei.lpFile = url.w_str();
sei.lpVerb = L"open";
sei.fMask = SEE_MASK_CLASSNAME;
sei.lpClass = url.startsWith("https:")
? L"https"
: L"http";
if (ShellExecuteEx(&sei)) {
return true;
}
但是这对 Microsoft Edge 不起作用,会弹出错误对话框说
<URL> The specified module could not be found
.
更新 2:
按照 Dúthomhas 的建议将 cmd /C start
的完整路径放入 CreateProcess()
使调用成功,
wui::string quotedArg = L"/C start microsoft-edge:" + url;
std::vector<WCHAR> argBuf(quotedArg.w_size() + 1);
wcscpy_s(&argBuf[0], argBuf.size(), quotedArg.w_str());
CreateProcess(L"C:\Windows\System32\cmd.exe", &argBuf[0], NULL,
NULL, FALSE, 0, NULL, NULL, &si, &pi)
但结果是没有打开浏览器,弹出对话框显示
microsoft-edge:<UR> The specified module could not be found
.
您正在做一些奇怪的事情,例如使用 std::vector 而不是直接 std::wstring。 (可以将 .c_str() 传递给这样的函数。)
在任何情况下,请务必阅读 CreateProcess.
等函数的文档
您必须为您的流程提供完整的命令行,而不仅仅是片段。没有名为 'start' 的可执行文件——它是 cmd.exe 的子命令。因此,如果您使用 CreateProcess,您还必须提供完整、真实的命令行:
C:\Windows\System32\cmd.exe /C start microsoft-edge:http://www.test.com
不过,总而言之,您真的不应该向您的用户发号施令,他应该使用哪个浏览器。您的用户选择了默认浏览器,因为这是他希望使用的浏览器。当您颠覆该选择并启动不同的浏览器时,他会讨厌您的软件。
[编辑]
好吧,我没有安装 Windows 10,所以我没有乱用 Edge,但它 appears that MS has not given it the standard command-line abilities。我不明白为什么。
不过,看起来您可能不得不坚持使用 'start' 命令 "protocol",使用您的 Update 2 使用的方法,只是省略 "microsoft-edge" 部分。
我可以建议的唯一其他方法(而且我对 Windows10 的了解还不够多,无法说这必然是唯一正确的方法)是查看注册表以查看 edge 是否安装,并以正确的方式启动浏览器。
唉。
据我所知,你把这件事闹得相当恶劣。当然,它并不像看起来那么复杂。以下代码调出 Edge window,并导航到所需站点:
#include <Windows.h>
int main()
{
CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
SHELLEXECUTEINFOW sei = { sizeof sei };
sei.lpVerb = L"open";
sei.lpFile = L"microsoft-edge:http://www.whosebug.com";
ShellExecuteExW(&sei);
}
我怀疑你的报价是乱七八糟的。
我尝试了 Launching Microsoft Edge with URL from code and
这是我的代码:
std::string url = "http://www.test.com";
std::wstring quotedArg = L"microsoft-edge:\"" + url + L"\"";
std::vector<WCHAR> argBuff(quotedArg.w_size() + 1);
wcscpy_s(&argBuff[0], argBuff.size(), quotedArg.w_str());
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof si;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
if (!CreateProcess(L"start", &argBuff[0], NULL, NULL, FALSE,
0, NULL, NULL, &si, &pi)) {
DWORD error = GetLastError(); // here error = 2
return false;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CreateProcess()
后的错误码为2,在https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382%28v=vs.85%29.aspx中代表ERROR_FILE_NOT_FOUND
。
更新一:
对于 Dúthomhas 的问题:
我没有将用户与 Edge 绑定。我使用 ShellExecuteEx()
打开 http/https URL 如下片段。
SHELLEXECUTEINFO sei = { };
sei.cbSize = sizeof sei;
sei.nShow = SW_SHOWNORMAL;
sei.lpFile = url.w_str();
sei.lpVerb = L"open";
sei.fMask = SEE_MASK_CLASSNAME;
sei.lpClass = url.startsWith("https:")
? L"https"
: L"http";
if (ShellExecuteEx(&sei)) {
return true;
}
但是这对 Microsoft Edge 不起作用,会弹出错误对话框说
<URL> The specified module could not be found
.
更新 2:
按照 Dúthomhas 的建议将 cmd /C start
的完整路径放入 CreateProcess()
使调用成功,
wui::string quotedArg = L"/C start microsoft-edge:" + url;
std::vector<WCHAR> argBuf(quotedArg.w_size() + 1);
wcscpy_s(&argBuf[0], argBuf.size(), quotedArg.w_str());
CreateProcess(L"C:\Windows\System32\cmd.exe", &argBuf[0], NULL,
NULL, FALSE, 0, NULL, NULL, &si, &pi)
但结果是没有打开浏览器,弹出对话框显示
microsoft-edge:<UR> The specified module could not be found
.
您正在做一些奇怪的事情,例如使用 std::vector 而不是直接 std::wstring。 (可以将 .c_str() 传递给这样的函数。)
在任何情况下,请务必阅读 CreateProcess.
等函数的文档您必须为您的流程提供完整的命令行,而不仅仅是片段。没有名为 'start' 的可执行文件——它是 cmd.exe 的子命令。因此,如果您使用 CreateProcess,您还必须提供完整、真实的命令行:
C:\Windows\System32\cmd.exe /C start microsoft-edge:http://www.test.com
不过,总而言之,您真的不应该向您的用户发号施令,他应该使用哪个浏览器。您的用户选择了默认浏览器,因为这是他希望使用的浏览器。当您颠覆该选择并启动不同的浏览器时,他会讨厌您的软件。
[编辑] 好吧,我没有安装 Windows 10,所以我没有乱用 Edge,但它 appears that MS has not given it the standard command-line abilities。我不明白为什么。
不过,看起来您可能不得不坚持使用 'start' 命令 "protocol",使用您的 Update 2 使用的方法,只是省略 "microsoft-edge" 部分。
我可以建议的唯一其他方法(而且我对 Windows10 的了解还不够多,无法说这必然是唯一正确的方法)是查看注册表以查看 edge 是否安装,并以正确的方式启动浏览器。
唉。
据我所知,你把这件事闹得相当恶劣。当然,它并不像看起来那么复杂。以下代码调出 Edge window,并导航到所需站点:
#include <Windows.h>
int main()
{
CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
SHELLEXECUTEINFOW sei = { sizeof sei };
sei.lpVerb = L"open";
sei.lpFile = L"microsoft-edge:http://www.whosebug.com";
ShellExecuteExW(&sei);
}
我怀疑你的报价是乱七八糟的。