Javascript 在64位Windows 10上安装OpenSSL for MSVC2017

Javascript 在64位Windows 10上安装OpenSSL for MSVC2017,javascript,qt,get,openssl,qml,Javascript,Qt,Get,Openssl,Qml,.pro LIBS += -LC:\Qt\Tools\OpenSSL\Win_x86\lib -llibssl LIBS += -LC:\Qt\Tools\OpenSSL\Win_x86\lib -llibcrypto INCLUDEPATH += C:\Qt\Tools\OpenSSL\Win_x86\include main.qml import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.0 Win

.pro

LIBS += -LC:\Qt\Tools\OpenSSL\Win_x86\lib -llibssl
LIBS += -LC:\Qt\Tools\OpenSSL\Win_x86\lib -llibcrypto
INCLUDEPATH += C:\Qt\Tools\OpenSSL\Win_x86\include
main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.0

Window {
    visible: true
    width: 640
    height: 480

    Component.onCompleted: getPage(logResults)

    function logResults(results) {
        console.log("RESULTS: " + results)
    }

    function getPage(callback) {
        var xhttp = new XMLHttpRequest();
        var url = "https://www.google.com/"

        xhttp.onreadystatechange = function() {
            if (xhttp.readyState === 4 && xhttp.status === 200) {
                console.log("calling callback")
                callback(xhttp.responseText)
            }
        };
        xhttp.open("GET", url);
        xhttp.send();
    }
}
预期产出

qml: calling callback
qml: RESULTS: <html>
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_ciphersuites
qt.network.ssl: QSslSocket: cannot resolve SSL_set_psk_use_session_callback
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_set_psk_use_session_callback
qml: calling callback
运行MSVC2017 QML项目的Windows 10 64位操作系统

qml: calling callback
qml: RESULTS: <html>
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_ciphersuites
qt.network.ssl: QSslSocket: cannot resolve SSL_set_psk_use_session_callback
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_set_psk_use_session_callback
qml: calling callback
我运行了
C:\Qt\MaintenanceTool.exe
来安装
Developer and Designer Tools>OpenSSL 1.1.1d工具包

我尝试了以下操作,但没有成功地解决错误或获得
xhttp.responseText
。我发现,所以我必须在我的windows机器上运行它,OpenSSL出现了一些奇怪的事情。通过谷歌搜索输出的错误消息,我找不到任何解决方案。我读过一篇文章,不小心将openSSL安装到“windows目录”可能会导致错误,但我无法实际找到所讨论的“windows目录”,以检查我是否找到了

编辑

qml: calling callback
qml: RESULTS: <html>
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_ciphersuites
qt.network.ssl: QSslSocket: cannot resolve SSL_set_psk_use_session_callback
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_set_psk_use_session_callback
qml: calling callback
C:\Qt\Tools\OpenSSL\Win\u x64\bin
我将
libcrypto-1\u 1-x64.dll
libssl-1\u 1-x64.dll
复制到我项目的
\debug
\release
文件夹中。这删除了qt.network.ssl错误,但是我仍然没有得到
qml:RESULTS:

您运行了C:\Qt\MaintenanceTool.exe来安装Developer和Designer 工具>OpenSSL 1.1.1d工具包

这也是我的建议。另一种方法是自己编译OpenSSL,或者从第三方提供商编译OpenSSL。我在
“C:\Program Files\OpenSSL-Win64\bin”
安装了其中一个软件包,使用
Qt+=network
的程序能够在path环境变量中包含库的路径时定位并加载库。问题是,您需要自己处理更新,但是Qt包会自动使用MaintenanceTool以及Qt和Qt Creator进行更新。所以选择吧

无论如何,即使您的路径中有另一组OpenSSL DLL,如果您将这些库复制到可执行文件的输出目录,这些库也将被加载。这里需要回答两个问题:1)如何在每次需要时自动复制DLL?2)如何在运行程序时验证加载了哪些DLL

1) 您可以将以下内容添加到项目中。pro:

win32 {
    CONFIG += file_copies
    CONFIG(debug, debug|release) {
        openssllibs.path = $$OUT_PWD/debug
    } else {
        openssllibs.path = $$OUT_PWD/release
    }
    contains(QMAKE_TARGET.arch, x86_64) {
        openssllibs.files = C:/Qt/Tools/OpenSSL/Win_x64/bin/libcrypto-1_1-x64.dll \
                            C:/Qt/Tools/OpenSSL/Win_x64/bin/libssl-1_1-x64.dll
    } else {
        openssllibs.files = C:/Qt/Tools/OpenSSL/Win_x86/bin/libcrypto-1_1.dll \
                            C:/Qt/Tools/OpenSSL/Win_x86/bin/libssl-1_1.dll
    }
    COPIES += openssllibs
}
就是这样。现在,您的程序将始终将Qt/Tools中的最新库复制到项目的输出目录,而不必担心是否在调试或发布模式下编译,或者32/64位或其他Qt工具包

2) 使用检查加载的DLL时运行程序。为此,请在Process Explorer->View->Show下部窗格中,在上部窗格中选择正在运行的程序。下面的窗格列出了所有加载的DLL和源代码。还有其他类似的实用程序,比如开源

即使理解以上所有内容,并且按照配方执行,您的程序仍然无法打印所需的输出。请更改qml中的函数logResults(),如下所示:

function logResults(results) {
    console.log("RESULTS Length=", results.length);
    console.log("results.substr=", results.substr(0, 20)); 
}
您将获得以下输出:

qml: calling callback
qml: RESULTS Length= 47932
qml: results.substr= <!doctype html><html

如果在运行时加载OpenSSL,请尝试将dll(ssl和crypto)添加到路径中,或将它们放在.exe旁边。我已将
libcrypto-1_1-x64.dll
libssl-1_1-x64.dll
添加到
\debug
文件夹中,从而删除了错误。然而,输出仍然不存在。我希望
qml:calling callback
qml:RESULTS:
,但我只得到了公式,可能是您得到了意外的状态或readyState?请看,我也希望得到同样的结果,只是它肯定得到了readyState 4和状态200,因为这一行:
if(xhtp.readyState==4&&xhtp.status==200){
这肯定会导致这种情况:
console.log(“调用回调”)
,所以我知道它正在调用
回调(xhttp.responseText)
,它在Ubuntu 18.4和19.4中工作,只是不在我的windows 10环境中编辑对不起,我应该澄清一下,我确实尝试过
console.log()
在readyState和status上,两者都按预期输出了
4
200
,我刚刚在cmd中验证了
curlhttps://www.google.com
返回预期的HTMLHANKS Pedro,我今晚将尝试此解决方案,并向您报告。正如您所说,它一直在工作,只是默默地失败。谢谢“我很高兴能提供帮助。此问题的
console.log()
值得进一步调查,并向Qt提交一份适当的错误报告。此问题后创建的错误报告需要支持。如果您对其解决方案感兴趣,请投票、评论和观看。此问题现在已在Qt 5.14.2中修复: