我有两个应用程序,分别安装在不同的文件夹中,分别称为应用程序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构建的。
有人对此问题有一些线索吗?
//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
答案 0 :(得分:0)
听起来您已经诊断出症状。解决它们可能很棘手,因为至少某些版本的InstallShield调用API会降低在建立应用程序文件夹之前加载意外DLL的能力。当您直接从安装程序启动流程时,这些调用的效果似乎会延续到您的流程中。
因此,首先,过度简化的选项1:从向导的最后一页删除该选项以启动您的应用程序。 of,问题消失了。但这可能会使其他人不高兴。
让我们尝试深入探讨正在发生的事情。根据InstallShield的确切版本,它可能正在调用API的某种组合,但是最有可能的罪魁祸首是对SetDllDirectory(L"");
的调用,根据某些quick research的说法,这只会对隐式加载的DLL产生影响。在子进程中,但这似乎不是您所描述的情况。
您已经尝试通过显式添加目录来撤消此调用;这是我推荐(但未经测试)的选项2和3:
SetDllDirectory
所述,请致电SetDllDirectory(NULL)
恢复默认搜索顺序,或AddDllDirectory
添加文件夹,然后调用LoadLibraryEx(..., LOAD_LIBRARY_SEARCH_USER_DIRS)