更新抱歉,大家好,我错误地确定了问题。一切正常,错误在"其他程序逻辑"。请删除或关闭问题。
Qt5用于在libeay32.dll
中的任何指令之前加载ssleay32.dll
和main()
程序启动(因为它是静态的)。
(详细信息:它位于qtbase\src\network\ssl\qsslsocket_openssl_symbols.cpp
:
static QPair<QSystemLibrary*, QSystemLibrary*> loadOpenSslWin32()
)
问题:
libeay32.dll
和ssleay32.dll
位于其exe dir Qt按此顺序加载搜索dll(来自qtbase\src\corelib\plugin\qsystemlibrary.cpp
):
没有。 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;。请删除或关闭问题。
答案 0 :(得分:5)
QSystemLibrary::load
为SSL调用 onlySystemDirectory = false
,因此QFileInfo(qAppFileName()).path()
是搜索DLL的第一个位置。搜索顺序:
我没有找到相关文档,但在我们的软件中,Qt在与应用程序.exe位于同一目录时找到SSL libeay32.dll
和ssleay32.dll
,这是
如果您有qt.conf
,则可能会应用默认库值,即.\lib
。
答案 1 :(得分:0)
图书馆搜索订单在MSDN上Dynamic-Link Library Search Order讨论。
有几种方法可以处理加载库,但听起来大多数都不适用。
我不清楚为什么你可以拨打ChangeCurrentWorkingDirectoryToExeDir
,但你不能拨打SetDllDirectory
。我可能错过了一些明显的东西。
似乎您的最后一个选择是创建Qt.exe.local
文件。这称为Dynamic-Link Library Redirection,将导致链接器加载本地文件中指定的DLL。