如何使用C ++代码中的特定URL启动Microsoft Edge

时间:2015-10-28 20:10:41

标签: c++ windows-10 microsoft-edge

我尝试了Launching Microsoft Edge with URL from codeHow to open URL in Microsoft Edge from the command line?中的解决方案,但它们对我不起作用。

这是我的代码:

    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

更新1: 致Dúthomhas的问题: 我没有用Edge绑定用户。我正在使用ShellExecuteEx()打开http / https网址,如下面的代码段所示。

    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

2 个答案:

答案 0 :(得分:4)

从我所看到的,你正在制造相当恶劣的天气。当然,它并不像看起来那么复杂。以下代码显示Edge窗口,并导航到所需的站点:

#include <Windows.h>

int main()
{
    CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);

    SHELLEXECUTEINFOW sei = { sizeof sei };
    sei.lpVerb = L"open";
    sei.lpFile = L"microsoft-edge:http://www.stackoverflow.com";
    ShellExecuteExW(&sei);
}

我怀疑你的报价很混乱。

答案 1 :(得分:2)

你正在做一些奇怪的事情,比如使用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。我无法理解为什么。

尽管如此,看起来您可能不得不坚持使用“更新2”使用的方法的“启动”命令“协议”,只需省略“微软边缘”部分。

我可以建议的唯一其他资源(我对Windows 10的了解不足以说这必然是唯一正确的方法)是在注册表中查看是否已安装edge,并启动浏览器用正确的方法。

唉。