4

我正在使用 C++Builder XE7 创建一个项目,其中用户可以单击按钮打开 Web 链接,例如打开支持页面,或在社交媒体上分享他的经验。为此,我使用了该ShellExecute()功能,它运行良好,除了一个按钮。

当我点击这个按钮时,什么也没有发生。函数返回没有错误(ShellExecute()返回值为42),但是我的默认浏览器没有打开,网页根本没有显示。

这是我的ShellExecute()实现

const HINSTANCE result = ::ShellExecute(handle, "open", url.c_str(), NULL, NULL, SW_SHOWDEFAULT);

我也试过这个ShellExecuteEx()功能:

::SHELLEXECUTEINFO info;
std::memset(&info, 0, sizeof(info));
info.cbSize = sizeof(info);
info.hwnd   = handle;
info.lpVerb = "open";
info.lpFile = url.c_str();
info.nShow  = SW_SHOWDEFAULT;

if (!::ShellExecuteEx(&info))

url参数包含我要打开的网站链接。出于安全原因,我不能将它作为示例发布在这里,但是我在浏览器(FireFox)中对其进行了测试,它运行良好。另一方面,如果我只是通过将url内容替换为谷歌网站来执行我的代码,那么一切都会按预期工作。

handle只是父框架的参数Handle

我还尝试调整ShellExecute/Ex()参数,例如hwndandnShow字段,但没有改变。

谁能指出我出了什么问题?

4

1 回答 1

4

url 格式如下:http://www. mysite.xxx/selectPage.php?arg1=xxx&arg2=yyy&...&argX=包含“引号”和一些 %26amp%3b 特殊字符的文本!

在此示例中,您必须对双引号和空格进行 URL 编码,因为它们对于URL 的查询部分不是有效字符。

通过用 . 替换双引号%22和空格来修复它%20。我建议使用一个函数UrlEscape()来正确编码 URL。

尽管大多数浏览器对用户输入具有容错性,并且也会接受没有有效编码的 URL,但最好严格遵循规范,因为不能保证该容错性。

此外,当 URL 作为命令行参数传递给与 URL 协议关联的命令时,双引号会产生问题。这是因为双引号是用于定义包含空格的命令行参数的保留字符

例如,在我的机器上,http协议与以下命令相关联(请参阅 参考资料HKEY_CLASSES_ROOT\http\shell\open\command):

"C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -osint -url "%1"

您可以看到双引号已用于将最后一个参数括起来,如果您在 URL 中使用未编码的双引号,这显然会变得混乱。

正确编码 URL 以与 一起使用的示例ShellExecuteEx()

#include <windows.h>
#include <Shellapi.h>

int main()
{
    ::CoInitialize(nullptr);

    SHELLEXECUTEINFOW info{ sizeof(info) };
    info.fMask  = SEE_MASK_NOASYNC; // because we exit process after ShellExecuteEx()
    info.lpVerb = L"open";
    info.lpFile = L"http://www.google.de/search?q=ShellExecuteEx%20URL%20%22double%20quotes%22";
    info.nShow  = SW_SHOWDEFAULT;

    if( !::ShellExecuteExW( &info ) )
    {
        DWORD err = ::GetLastError();
        printf("ShellExecuteEx failed with error %d\n", err );
    }

    ::CoUninitialize();
}
于 2017-07-03T21:21:27.733 回答