qt/LedOK/main.cpp
2022-01-20 10:08:17 +08:00

124 lines
6.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mainwindow.h"
#include <QApplication>
#include <QSplashScreen>
//#include <JQHttpServer.h>
#include "ccrashstack.h"
//#include "DbgHelp.h"
#ifdef Q_OS_WIN
long __stdcall callback(_EXCEPTION_POINTERS* excp){
CCrashStack crashStack(excp);
QString sCrashInfo = crashStack.GetExceptionInfo();
// TCHAR my_documents[MAX_PATH];
// SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, SHGFP_TYPE_CURRENT, my_documents);
// QString file_path = QString::fromWCharArray(my_documents);
QDir dir;
QString file_path = dir.currentPath();
QDir *folder_path = new QDir;
bool exist = folder_path->exists(file_path.append("\\MyApp"));
if(!exist) folder_path->mkdir(file_path);
delete folder_path;
folder_path = nullptr;
QFile file("d:\\mycrash.log");
if(file.open(QIODevice::WriteOnly|QIODevice::Truncate)){
file.write(sCrashInfo.toUtf8());
file.close();
}
QMessageBox::critical(NULL,"程式崩溃","<FONT size=4><div><b>程序崩溃请将d盘根目录下的mycrash.log文件发送到fyx@xixunled.com邮箱</b><br/></div>研发人员会尽快处理修改程序bug并给出解决方案", QMessageBox::Ok);
return EXCEPTION_EXECUTE_HANDLER;
}
#endif
//static LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
//{
// //And output crash information
// EXCEPTION_RECORD *record = pException->ExceptionRecord;
// QString errCode(QString::number(record->ExceptionCode, 16));
// QString errAddr(QString::number((uint)record->ExceptionAddress, 16));
// QString errFlag(QString::number(record->ExceptionFlags, 16));
// QString errPara(QString::number(record->NumberParameters, 16));
// qDebug()<<"errCode: "<<errCode;
// qDebug()<<"errAddr: "<<errAddr;
// qDebug()<<"errFlag: "<<errFlag;
// qDebug()<<"errPara: "<<errPara;
// //Create the dump file
// //HANDLE hDumpFile = CreateFile((LPCWSTR)QString("../bin_vs/crash.dmp").utf16(),
// HANDLE hDumpFile = CreateFile((LPCWSTR)QString("crash.dmp").utf16(),
// GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// if(hDumpFile != INVALID_HANDLE_VALUE) {
// MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
// dumpInfo.ExceptionPointers = pException;
// dumpInfo.ThreadId = GetCurrentThreadId();
// dumpInfo.ClientPointers = TRUE;
// MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
// CloseHandle(hDumpFile);
// }
// //这里弹出一个错误对话框并退出程序
// QMessageBox::critical(NULL,"程式崩溃","<FONT size=4><div><b>对于发生的错误,表示诚挚的歉意</b><br/></div>"+
// QString("<div>错误代码:%1</div><div>错误地址:%2</div></FONT>").arg(errCode).arg(errAddr),
// QMessageBox::Ok);
// return EXCEPTION_EXECUTE_HANDLER;
//}
//主程序入口
int main(int argc, char *argv[]){
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
SetUnhandledExceptionFilter(callback);
//步骤3:
//通过qt命令行进入 执行命令:
//objdump -S xxx.exe >aaa.asm
//命令执行完成后根据步骤2中获得的crash堆栈信息在aaa.asm中查找响应地址即可得到崩溃具体位置。
// SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
// 在项目的proproject文件里增加QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG
// 这句话的目的是Release版也将生成“.pdb”后缀的调试信息文件。在使用WinDbg导入Dump前。指定好源代码与pdb文件的位置。就可以在错误报告内看到罪魁祸首是哪一行代码。
QApplication a(argc, argv);
QSplashScreen *splash = new QSplashScreen;
splash->setPixmap(QPixmap(":/res/splash.png"));
splash->show();
//Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
splash->showMessage(QObject::tr("Setting up the LedOK Express...") , Qt::AlignRight | Qt::AlignTop , Qt::white);
/* JQHttpServer::TcpServerManage tcpServerManage( 2 ); // 设置最大处理线程数默认2个
tcpServerManage.setHttpAcceptedCallback( []( const QPointer< JQHttpServer::Session > &session )
{
// 回调发生在新的线程内,不是主线程,请注意线程安全
// 若阻塞了此回调那么新的连接将不会得到处理默认情况下有2个线程可以阻塞2次第3个连接将不会被处理
// session->replyText( QString( "url:%1\nbody:%2" ).arg( session->requestUrl(), QString( session->requestBody() ) ) );
// session->replyRedirects( QUrl( "http://www.baidu.com" ) );
// session->replyJsonObject( { { { "message", "ok" } } } );
QString strRequestUrl=session.data()->requestUrl();
if(strRequestUrl.contains("/download?id="))
{
QString strId=strRequestUrl.right(strRequestUrl.length()-13);
session->replyFile( "C:/Users/64549/Documents/LedOK Express/NPrograms/新建20200330111731834_tmp/"+strId );
}
//session->replyJsonArray( { "a", "b", "c" } );
// session->replyFile( "G://11.o" );
// session->replyImage( QImage( "/Users/jason/Desktop/Test.png" ) );
// session->replyBytes(QByteArray(4,'\x24')); // $$$$
// 注1因为一个session对应一个单一的HTTP请求所以session只能reply一次
// 注2在reply后session的生命周期不可控所以reply后不要再调用session的接口了
} );
qDebug() << "listen:" << tcpServerManage.listen( QHostAddress::Any, 23412 );
splash->showMessage(QObject::tr("httpserver listen...") , Qt::AlignRight | Qt::AlignTop , Qt::white);
*/
MainWindow w;
//splash->showMessage(QObject::tr("Loading modules..."),Qt::AlignRight | Qt::AlignTop ,Qt::white);
//loadModules();
//splash->showMessage(QObject::tr("Establishing connections..."),Qt::AlignRight | Qt::AlignTop ,Qt::white);
//establishConnections();
splash->showMessage(QObject::tr("Setting up the LedOK Express OK!") , Qt::AlignRight | Qt::AlignTop , Qt::white);
w.show();
splash->finish(&w);
delete splash;
return a.exec();
}