强制Qt5从exe dir加载SSL dll

vla*_*don 4 c++ windows dll qt qt5

更新对不起,伙计们,我错误地确定了问题.一切正常,错误在于"其他程序逻辑".请删除或关闭问题.

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

(详情:它位于qtbase\src\network\ssl\qsslsocket_openssl_symbols.cpp:

static QPair<QSystemLibrary*, QSystemLibrary*> loadOpenSslWin32()
Run Code Online (Sandbox Code Playgroud)

)

问题:

  • 我的程序开始时不是它的exe目录作为工作目录
  • libeay32.dll并且ssleay32.dll驻留在它的exe目录中
  • 用户无法在系统目录中安装OpenSSL
  • 用户无法更改PATH变量
  • 我无法重新编译Qt,即使用openssl-linked编译的静态Qt发送程序

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

  1. 申请路径.
  2. 系统库路径.
  3. 尝试PATH环境变量中的所有路径.

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 ..
}
Run Code Online (Sandbox Code Playgroud)

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

更新对不起,伙计们,我错误地确定了问题.一切正常,错误在于"其他程序逻辑".请删除或关闭问题.

Sim*_*rta 5

QSystemLibrary::loadonlySystemDirectory = false对于SSL 调用,所以QFileInfo(qAppFileName()).path()是搜索DLL的第一个位置.搜索顺序:

  1. 申请目录
  2. 系统路径(例如C:\ Windows\System32)
  3. PATH中的所有路径

我没有找到相关的文档,但在我们的软件中,Qt找到SSL libeay32.dll,ssleay32.dll当它们与应用程序.exe位于同一目录中时,给定

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

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