0%

【Linux技术分享】调整容器中默认启动浏览器为系统外部浏览器

容器中打开网址浏览器默认为容器中的ie,有时候会存在部分问题,需要将其调整为外部linux的浏览器

1.目标应用在使用打印时直接跳转到容器内部ie浏览器,无法跳转到外部的谷歌浏览器

2.增加reg通道日志,发现是通过注册表找默认浏览器路径进行打开,在注册表中默认就是用的ie浏览器
图2

3.修改注册表,将该路径修改为系统中谷歌浏览器的软连接
图3
图6

4.在点击打印的时候可以跳转谷歌,但是应用直接奔溃退出了
图4

5.根据经验,知道谷歌浏览器的启动是通过exec这种方式启动的,增加exec模块日志通道分析崩溃原因
图5

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)