容器中打开网址浏览器默认为容器中的ie,有时候会存在部分问题,需要将其调整为外部linux的浏览器
1.目标应用在使用打印时直接跳转到容器内部ie浏览器,无法跳转到外部的谷歌浏览器
2.增加reg通道日志,发现是通过注册表找默认浏览器路径进行打开,在注册表中默认就是用的ie浏览器
3.修改注册表,将该路径修改为系统中谷歌浏览器的软连接
4.在点击打印的时候可以跳转谷歌,但是应用直接奔溃退出了
5.根据经验,知道谷歌浏览器的启动是通过exec这种方式启动的,增加exec模块日志通道分析崩溃原因
6.通过日志定位代码部分发现该部分是使用ddeconnect函数返回无效的hconv导致启动程序返回一个错误码
7.ddeconnect函数主要功能是用于用户window内部程序的数据交换,但是我们启动是外部系统也就是系统中的chrome,所以该函数无法获取正确数据,这里需要进行特殊处理
8.处理后就可以在应用中打印正常打开chrome了
9.完整代码如下
+++ b/dlls/shell32/shlexec.c
@@ -781,6 +781,7 @@ static unsigned dde_connect(const WCHAR* key, const WCHAR* start, WCHAR* ddeexec
HDDEDATA hDdeData;
unsigned ret = SE_ERR_NOASSOC;
BOOL unicode = !(GetVersion() & 0x80000000);
BOOL outcmd = FALSE;
if (lstrlenW(key) + 1 > ARRAY_SIZE(regkey))
{
@@ -883,12 +884,17 @@ static unsigned dde_connect(const WCHAR* key, const WCHAR* start, WCHAR* ddeexec
if (!hConv)
{TRACE("Launching %s\n", debugstr_w(start));
outcmd = wcsstr(start, L"outcmd_"); ret = execfunc(start, env, TRUE, psei, psei_out); if (ret <= 32) { TRACE("Couldn't launch\n"); goto error; }
if(ret == 33 && outcmd){
FIXME("using outside cmdline\n");
return ret;
} hConv = DdeConnect(ddeInst, hszApp, hszTopic, NULL); if (!hConv)