【发布时间】:2017-07-03 15:47:47
【问题描述】:
我正在使用 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 内容替换为 Google 的网站来执行我的代码,则一切正常。
handle 只是父框架的Handle 参数。
我还尝试调整 ShellExecute/Ex() 参数,例如 hwnd 和 nShow 字段,但没有改变。
谁能指出哪里出了问题?
【问题讨论】:
-
你能发一个minimal reproducible example吗?另外你的默认浏览器是什么?如果您执行 Start-Run 然后键入一些 url,例如
http://www.stackoverflow.com/,会发生什么。 -
很遗憾,我无法发布更多代码。调用 ShellExecute() 之前的代码只是在函数内部构建 URL,我不允许展示它。在调用方,这个函数只是在按钮事件内部调用,带有按钮父级的句柄。所以上面的代码已经是我允许提供的最简单的代码示例了。
-
我的 Windows 配置一切正常。正如我在上面的帖子中所说,我的默认浏览器是 FireFox,并且 Start-Run 按预期使用提供的链接打开它。而且,我的代码中的同一个 ShellExecute() 可以很好地使用一个简单的链接,比如google.com。但是 ShellExecute() 本身的行为对我的 url 来说很奇怪:为什么它什么都不做就返回,而且没有错误?可能是 ShellExecute() 错误?
-
a text contains \"quotes\" ...您是否真的对双引号进行了编码,或者这就是您从 C++ 源中复制字符串的方式?
-
在
argX=a text containing ...中,您是否以%HH格式编码空格字符和其他保留字符?如果没有,您需要这样做。
标签: c++ windows browser shellexecute c++builder-xe7