【发布时间】:2015-06-03 13:30:09
【问题描述】:
更新对不起,伙计们,我错误地确定了问题。一切正常,错误出现在“其他程序逻辑”中。请删除或关闭问题。
Qt5 设计为在程序启动时在 main() 中的任何指令之前加载 libeay32.dll 和 ssleay32.dll(因为它是静态的)。
(详情:位于qtbase\src\network\ssl\qsslsocket_openssl_symbols.cpp:
static QPair<QSystemLibrary*, QSystemLibrary*> loadOpenSslWin32()
)
问题:
- 我的程序不是以 exe 目录作为工作目录开始的
-
libeay32.dll和ssleay32.dll位于其 exe 目录中 - 用户无法在系统目录中安装 OpenSSL
- 用户无法更改 PATH 变量
- 我无法重新编译 Qt,即使用 openssl-linked 编译的静态 Qt 发布程序
Qt 按此顺序加载搜索 dll(来自qtbase\src\corelib\plugin\qsystemlibrary.cpp):
- 应用路径。
- 系统库路径。
- 尝试 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 ..
}
更改工作目录后如何强制 Qt5 重新加载 OpenSSL DLL? 可能有人已经遇到过这个问题...
更新对不起,伙计们,我错误地确定了问题。一切正常,错误出现在“其他程序逻辑”中。请删除或关闭问题。
【问题讨论】:
-
为什么不从 exe 目录作为工作目录启动应用程序?
-
@m.s.它作为 URI 协议处理程序 (msdn.microsoft.com/en-us/en_us/library/aa767914(VS.85).aspx) 启动,无法指定工作目录
-
好的,但是你为什么不能重新编译Qt呢?为什么 PATH 变量是不可修改的?
-
这个函数是静态的,但这并不意味着它正在执行那个函数,这仍然需要你自己做。
-
如果 Qt 会从工作目录加载库,那将是一个安全问题(可能会注入其他 DLL)。我不明白为什么可执行文件的目录不应该工作,这是放置文件的通常位置。