我试图让Qt 5.8在Windows上使用OpenSSL,但每次我向前迈进一步,我都会遇到另一个更大的对象。
编辑/更新:仅在调试模式下才会出现此错误!
到目前为止,这是我的设置:
但问题是: 无论是否使用SSL,我每次打开连接都会因退出应用程序而出错。 抛出(ntdll.dll)的异常。
我使用Visual Leak Detector测试了我的代码,因为我认为这是一个内存问题,但它并没有解决我的问题。 我不知道我应该在哪里开始......
Here is a small example in Qt Creator 4.2.1 which doesn't work either
这是我的代码(当我删除OpenSSL dll时,它可以正常使用http):
void InfoGatherer::getInfo(QString name)
{
// TODO: Search for the name and select right page
QUrl url = QUrl(name);
data.clear();
QNetworkRequest *request = new QNetworkRequest(url);
request->setRawHeader("User-Agent", userAgent);
if (name.startsWith("https"))
{
QSslConfiguration sslConfiguration(QSslConfiguration::defaultConfiguration());
sslConfiguration.setProtocol(QSsl::TlsV1_2OrLater);
request->setSslConfiguration(sslConfiguration);
}
else
{
// TODO: Try to get https
}
reply = webCtrl->get(*request);
connect(reply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(finished()), this, SLOT(onReplyFinished()));
// Mem leaks (Visual Leak Detector)
if(!name.startsWith("https"))
webCtrl->deleteResource(*request);
delete request;
}
void InfoGatherer::onReadyRead()
{
data.append(reply->readAll());
}
void InfoGatherer::slotError(QNetworkReply::NetworkError)
{
// TODO
qWarning() << "ErrorNo: " << reply->error() << "for url: " << reply->url().toString();
qDebug() << "Request failed, " << reply->errorString();
qDebug() << "Headers:" << reply->rawHeaderList() << "content:" << reply->readAll();
}
void InfoGatherer::onReplyFinished()
{
QString html = QString(data);
emit got_webpage(&html);
}
Qt正确检测到OpenSSL库:
qDebug() << "Support SSL: " << QSslSocket::supportsSsl()
<< "\nLib Version Number: " << QSslSocket::sslLibraryVersionNumber()
<< "\nLib Version String: " << QSslSocket::sslLibraryVersionString()
<< "\nLib Build Version Number: " << QSslSocket::sslLibraryBuildVersionNumber()
<< "\nLib Build Version String: " << QSslSocket::sslLibraryBuildVersionString();
答案 0 :(得分:2)
也许您可以从slproweb.com尝试为OpenSSL预构建Windows二进制文件。此外,似乎 Qt 5.8 需要 OpenSSL v1.0.2 才能正常工作。
答案 1 :(得分:1)
解决方案:
再次从OpenSSL构建所有dll,不要忘记构建调试dll。
Here是如何构建dll的非常好的链接。构建64位正常和调试版本!
从脚注使用: - nmake -f ms \ nt dll .mak(install)来获取dll的
并且不将dll重命名为libeay64.dll和ssleay64.dll。
答案 2 :(得分:0)
这对我有用。只是一个请求的局部变量。
QUrl imageUrl = QUrl (link);
QNetworkRequest request (imageUrl);
/* SSL Configuration */
QSslConfiguration sslConfiguration = request.sslConfiguration();
sslConfiguration.setPeerVerifyMode (QSslSocket::VerifyNone);
sslConfiguration.setProtocol (QSsl::AnyProtocol);
request.setSslConfiguration (sslConfiguration);
networkAccessMgr->get (request);
QSslSocket::VerifyNone
QSsl::AnyProtocol