上个星期,我开发了一个软件,准备发布售卖,发现个别用户运行我的软件实现激活码验证时无法进行请求,而个别的又可以,刚开始我以为是我打包的问题,后面我想了个办法来获取exe软件的日志输出,由于我目前只有一台电脑,因此打包的exe在我的电脑上运行正常是应该的,而我不可能额把源码暴露给客户,因为我的软件本来就是加密的,需要激活码来激活的,因此决定利用qt的日志,即实现把源码的qdebug或者其他方式的打印信息全部写入日志中,如图所示
即把程序运行过程中的任何输出都写入到app_log.txt中,main.cpp的源码如下所示
#include "widget.h"
#include<QDateTime>
#include <QApplication>
// 声明自定义消息处理函数
void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
// 定义日志文件路径
QString logFilePath = "app_log.txt";
// 打开日志文件,以追加方式写入
QFile logFile(logFilePath);
if (logFile.open(QIODevice::Append | QIODevice::Text)) {
QTextStream stream(&logFile);
// 根据消息类型写入相应前缀
switch (type) {
case QtDebugMsg:
stream << "[Debug] ";
break;
case QtInfoMsg:
stream << "[Info] ";
break;
case QtWarningMsg:
stream << "[Warning] ";
break;
case QtCriticalMsg:
stream << "[Critical] ";
break;
case QtFatalMsg:
stream << "[Fatal] ";
break;
}
// 写入消息内容和额外信息
stream << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") << " ";
stream << context.file << ":" << context.line << " - " << context.function << " - " << msg << endl;
// 关闭日志文件
logFile.close();
}
}
int main(int argc, char *argv[])
{
qInstallMessageHandler(customMessageHandler);
QApplication a(argc, argv);
Widget w;
w.show();
qRegisterMetaType<QList<QStringList>>("QList<QStringList>");
qRegisterMetaType<Qt::SortOrder>("Qt::SortOrder");
return a.exec();
}
然后重新将代码打包成exe,再次发布给客户,然后远程客户运行exe,查看app_log.txt中的输出,发现是无法进行https请求的错误,然后打印下
qDebug() << QSslSocket::sslLibraryBuildVersionString();
需要的版本,我需要的是"OpenSSL 1.1.1b 26 Feb 2019"版本,我们先下载openssl,网址如下:https://slproweb.com/products/Win32OpenSSL.html 然后滑倒底部,找到对应版本,我的电脑是64位的,直接下载,如图所示
安装后,找到安装目录下的这2个文件
然后复制这2个文件到你打包exe的那个文件夹中就行,在打包发给客户,问题解决!
点击此处登录后即可评论