2017-05-19 13 views
1

Windows上でOpenSSLを使ってQt 5.8を動作させようとしていますが、前進するたびに別の大きなオブジェクトにぶつかります。Qt 5.8をWindows上でOpenSSLを使って作業する方法

編集/更新:このエラーはデバッグモードでのみ発生します。 Qtの5.8

  • のOpenSSLのダウンロードとコンパイルされたバージョン
  • 転送MSVS2015
  • コピーされたdllファイルへの小規模なテストプロジェクト(libeay32.dllおよびインストール済み

    • :ここ

      は、これまでのところ、私の設定ですssleay32.dll)をアプリケーションディレクトリ
    • SSL接続が正常に動作しています

    しかしここに問題があります: SSLを使用しているかどうかにかかわらず、接続を開くたびに、アプリケーションを終了するとエラーが発生します。 (ntdll.dll)で例外がスローされました。

    Error Message, Call Stack, ...

    私はそれがメモリの問題だと思ったが、それは私の問題を解決していませんので、私は、Visual漏れ検出器で自分のコードをテストしました。

    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:私が結集 は、ここで私はもう開始する必要があり見当もつかない...

    Here is a small example in Qt Creator 4.2.1 which doesn't work either

    は私のコード(Iは、OpenSSLのDLLを削除すると、それは、HTTPで正常に動作します)ではありません持っています正しく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(); 
    
    • サポートSSL:真
    • Libのバージョン番号:268443791
    • Libのバージョン文字列: "のOpenSSL 1.0.2h 2016年5月3日"
    • Libはバージョン番号をビルドします。 "のOpenSSL 1.0.2h 2016年5月3日":268443791
    • Libのバージョン文字列を構築します
  • 答えて

    1

    はソリューション:

    が再びのOpenSSLからすべてのDLLのを構築し、デバッグのdllのを構築することを忘れてはいけないし。

    Hereは、dllを構築する方法の非常に良いリンクです。 64ビットのノーマルとデバッグのバージョンをビルドしてください!脚注から

    は使用: - のnmake -fミリ秒\ DLLの

    そして名前変更DLLのは、libeay64.dllするしていないとssleay64.dllを取得するためにDLL .MAK(インストール)をNT。

    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
    +0

    いや、これは何も解決しません。それを私のコードでTestetし、より小さな例をテストするための新しい小さなプロジェクトを作成しました。 (https://drive.google.com/file/d/0B4RkTj0UzvBAUWJjSi1KUFEzVjQ/view?usp=sharing)私にとって – Darkproduct

    +0

    作品[ここでのQt Creatorを4.2.1での私の小さなプロジェクトがあります]。何もクラッシュしない。 [画像](https://ibb.co/b3HByF)私にとっては同じ – codekaizer

    +0

    いやを参照してください、私はアプリケーション閉じるときに - >「DebugForOnlineTest.exeはもう動作しませんが、あなたが問題を検索したいです?」興味深いもの: – Darkproduct

    2

    たぶん、あなたはslproweb.comからのOpenSSLのために事前に作成Windowsバイナリを試みることができます。また、のQt 5.8ニーズのOpenSSL 1.0.2が正しく動作するようです。

    +0

    私の質問の最後の5点をお読みください。私はすでにOpenSSL 1.0.2hで作業しています! – Darkproduct

    +0

    ああ、私はその点を逃した。 – 0x2648

    関連する問題