强制Qt5从exe dir加载SSL dll

时间:2015-06-03 13:30:10

标签: c++ windows qt dll qt5

更新抱歉,大家好,我错误地确定了问题。一切正常,错误在"其他程序逻辑"。请删除或关闭问题。

Qt5用于在libeay32.dll中的任何指令之前加载ssleay32.dllmain()程序启动(因为它是静态的)。

详细信息:它位于qtbase\src\network\ssl\qsslsocket_openssl_symbols.cpp

static QPair<QSystemLibrary*, QSystemLibrary*> loadOpenSslWin32()

问题:

  • 我的程序首先不是它的exe目录作为工作目录
  • libeay32.dllssleay32.dll位于其exe dir
  • 用户无法在系统目录中安装OpenSSL
  • 用户无法更改PATH变量
  • 我无法重新编译Qt,即使用openssl-linked编译的静态Qt发送程序

Qt按此顺序加载搜索dll(来自qtbase\src\corelib\plugin\qsystemlibrary.cpp):

  1. 申请路径。
  2. 系统库路径。
  3. 尝试PATH环境变量中的所有路径。
  4. 没有。 1是应用程序路径,但实际上它不会在那里搜索。

    我的节目:

    int main()
    {
        // at this point Qt5 already checked and tried to load the DLLs
    
        // so this:
    
        ChangeCurrentWorkingDirectoryToExeDir(); // some function to change cwd to current exe dir 
    
        // does not work :-(
    
        // ... other program logic ..
    }
    

    如何在更改工作目录后强制Qt5重新加载OpenSSL DLL? 可能是某人已经面临这个问题...

    更新抱歉,大家好,我错误地确定了问题。一切正常,错误在&#34;其他程序逻辑&#34;。请删除或关闭问题。

2 个答案:

答案 0 :(得分:5)

使用QSystemLibrary::load为SSL调用

onlySystemDirectory = false,因此QFileInfo(qAppFileName()).path()是搜索DLL的第一个位置。搜索顺序:

  1. application dir
  2. 系统路径(例如C:\ Windows \ System32)
  3. PATH中的所有路径
  4. 我没有找到相关文档,但在我们的软件中,Qt在与应用程序.exe位于同一目录时找到SSL libeay32.dllssleay32.dll,这是

    • .dll文件不在PATH中
    • .dll文件不在工作目录中
    • 没有qt.conf存在

    如果您有qt.conf,则可能会应用默认库值,即.\lib

答案 1 :(得分:0)

图书馆搜索订单在MSDN上Dynamic-Link Library Search Order讨论。

有几种方法可以处理加载库,但听起来大多数都不适用。

我不清楚为什么你可以拨打ChangeCurrentWorkingDirectoryToExeDir,但你不能拨打SetDllDirectory。我可能错过了一些明显的东西。

似乎您的最后一个选择是创建Qt.exe.local文件。这称为Dynamic-Link Library Redirection,将导致链接器加载本地文件中指定的DLL。