如果应用是从安装选项启动的,

时间:2019-03-29 08:57:41

标签: c++ windows installshield loadlibrary

我有两个应用程序,分别安装在不同的文件夹中,分别称为应用程序A和B,A是主应用程序,B是COM模块,A在启动后将通过COM API启动B,需要一些DLL B启动时由B加载,如果我通过双击A的快捷方式启动A,一切正常,但是如果我安装A,然后通过在安装的最后一个对话框中检查start A选项来启动A,则B为启动,但其中一个DLL加载失败,错误代码为126(ERROR_MOD_NOT_FOUND),如果我退出并通过双击快捷方式再次重新启动,它将再次起作用。

已经做了一些谷歌,似乎从快捷方式启动和安装之间的唯一区别是当前目录,即,如果从安装选项启动,则与从带有cmd的安装程序包文件夹开始一样,例如打开cmd,切换到以下文件夹安装程序包,然后以完整路径启动应用程序A,我已经尝试过了,效果也很好。

我的安装程序包是由installshield构建的。

有人对此问题有一些线索吗?

  1. 已经尝试将当前目录切换到A和B的安装路径,但都无法解决此问题。
  2. 已经尝试将dll目录设置为B的安装路径,该路径也是失败的DLL的路径,也无法正常工作。
  3. 已经尝试用完整路径加载DLL,也失败了。
    //SetCurrentDirectory(L"C:\Program Files (x86)\install path of A"); <<<not work
    //SetCurrentDirectory(L"C:\Program Files (x86)\install paht of B");   <<<not work
    //SetDllDirectory(L"C:\Program Files (x86)\DLL path");   <<<not work
    //m_hLibrary = LoadLibrary((LPCWSTR)DLL full path);   //not work
    m_hLibrary = LoadLibrary((LPCWSTR)dllName.c_str());   //failed with error code 126

1 个答案:

答案 0 :(得分:0)

听起来您已经诊断出症状。解决它们可能很棘手,因为至少某些版本的InstallShield调用API会降低在建立应用程序文件夹之前加载意外DLL的能力。当您直接从安装程序启动流程时,这些调用的效果似乎会延续到您的流程中。

因此,首先,过度简化的选项1:从向导的最后一页删除该选项以启动您的应用程序。 of,问题消失了。但这可能会使其他人不高兴。

让我们尝试深入探讨正在发生的事情。根据InstallShield的确切版本,它可能正在调用API的某种组合,但是最有可能的罪魁祸首是对SetDllDirectory(L"");的调用,根据某些quick research的说法,这只会对隐式加载的DLL产生影响。在子进程中,但这似乎不是您所描述的情况。

您已经尝试通过显式添加目录来撤消此调用;这是我推荐(但未经测试)的选项2和3: