解决twainui里面窗口释放后野指针可能造成的风险

This commit is contained in:
luoliangyi 2023-06-28 18:14:37 +08:00
parent 7117b9317d
commit f5cfcf38b7
6 changed files with 20 additions and 29 deletions

View File

@ -79,9 +79,8 @@ int Manager::showSettingUi(bool qt, SANE_Handle device, HWND parent, LPSANEAPI a
int Manager::showProgressUi(bool qt, HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify)
{
m_progressUiparent = parent;
hg_settingdialog *settingDlg = hg_settingdialog::GetSettingDialog();
if (nullptr != settingDlg)
m_progressUiparent = (HWND)settingDlg->winId();
if (nullptr != m_settingUi)
m_progressUiparent = (HWND)m_settingUi->winId();
m_progressUiCallback = callback;
m_notify = notify;
@ -237,7 +236,7 @@ void Manager::on_createSettingUi(bool qt)
};
if (m_settingUi == nullptr)
m_settingUi = new hg_settingdialog(m_device, &m_api, m_with_scan, m_devName.c_str(), close_prog, qParent);
m_settingUi = new hg_settingdialog(this, m_device, &m_api, m_with_scan, m_devName.c_str(), close_prog, qParent);
m_settingUi->setModal(true);
m_settingUi->show();
}
@ -267,7 +266,7 @@ void Manager::on_createProgressUi(bool qt)
m_progressUiCallback = std::function<void(ui_result)>();
};
if (m_progressUi == nullptr)
m_progressUi = new Dialog_progress_ui(close_prog, m_notify, qParent);
m_progressUi = new Dialog_progress_ui(this, close_prog, m_notify, qParent);
m_progressUi->setModal(true);
m_progressUi->show();

View File

@ -56,7 +56,7 @@ private slots:
void on_deleteMessageBoxUi();
void on_deleteManager();
private:
public:
QTranslator m_translator;
QTranslator m_translator_qt;
int m_langCode;

View File

@ -1,3 +1,4 @@
#include "Manager.h"
#include "dialog_progress_ui.h"
#include "ui_dialog_progress_ui.h"
#include "lang/app_language.h"
@ -6,11 +7,10 @@
#include <QTimer>
#include <thread>
Dialog_progress_ui *Dialog_progress_ui::m_param = nullptr;
extern Manager* g_manager;
static int imageRecivedCount = 0;
Dialog_progress_ui::Dialog_progress_ui(std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify, QWidget *parent) :
Dialog_progress_ui::Dialog_progress_ui(class Manager *mgr, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify, QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog_progress_ui)
, m_isScanning(false)
@ -30,11 +30,10 @@ Dialog_progress_ui::Dialog_progress_ui(std::function<void (ui_result)> callback,
ui->label_totalImgRecived->setVisible(false);
ui->lineEdit_imgRecived->setText(QString::number(imageRecivedCount));
m_mgr = mgr;
m_callback = callback;
*notify = FuncNotify;
m_param = this;
m_timer = new QTimer(this);
connect(this, SIGNAL(scan_status(QString,bool)), this, SLOT(on_scan_status(QString,bool)), Qt::QueuedConnection);
@ -44,7 +43,7 @@ Dialog_progress_ui::Dialog_progress_ui(std::function<void (ui_result)> callback,
Dialog_progress_ui::~Dialog_progress_ui()
{
m_param = nullptr;
m_mgr->m_progressUi = nullptr;
imageRecivedCount = 0;
@ -120,7 +119,7 @@ void Dialog_progress_ui::on_image_recived()
void Dialog_progress_ui::FuncNotify(int event, void *msg, int flag)
{
Dialog_progress_ui *p = (Dialog_progress_ui *)m_param;
Dialog_progress_ui *p = (Dialog_progress_ui *)g_manager->m_progressUi;
if (nullptr == p)
{
return;

View File

@ -15,15 +15,12 @@ class Dialog_progress_ui : public QDialog
bool quit_ = false;
public:
explicit Dialog_progress_ui(std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify, QWidget *parent = nullptr);
explicit Dialog_progress_ui(class Manager *mgr, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify, QWidget *parent = nullptr);
~Dialog_progress_ui();
protected:
void keyPressEvent(QKeyEvent *e) override;
private:
static Dialog_progress_ui *m_param;
signals:
void scan_status(QString finishInfo, bool isScanning);
void scan_finish(int flag, QString finishInfo);
@ -48,6 +45,7 @@ public:
private:
Ui::Dialog_progress_ui *ui;
class Manager *m_mgr;
std::function<void (ui_result)> m_callback;
QTimer *m_timer;
bool m_isScanning;

View File

@ -1,3 +1,4 @@
#include "Manager.h"
#include "hg_settingdialog.h"
#include <QDebug>
#include <QLatin1String>
@ -15,10 +16,10 @@
#include "dialog_device_scan.h"
#include "app_cfg.h"
#include "base/HGBase64.h"
hg_settingdialog * hg_settingdialog::hg_setting_ui_ =NULL;
std::string hg_settingdialog::property_combox_data_type_ = "combox_value_type";
hg_settingdialog::hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName,
hg_settingdialog::hg_settingdialog(class Manager *mgr, SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName,
std::function<void(ui_result)> callback, QWidget *parent)
: QDialog(parent)
, save_(false)
@ -29,7 +30,7 @@ hg_settingdialog::hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, b
, m_devName(devName)
, m_callback(callback)
{
hg_setting_ui_ = this;
m_mgr = mgr;
m_langCode = lang_get_cur_code_page();
if (20127 == m_langCode)
{
@ -134,17 +135,12 @@ hg_settingdialog::~hg_settingdialog()
cur_scheme_->release();
cur_cfg_->release();
hg_setting_ui_ = NULL;
m_mgr->m_settingUi = NULL;
if(!quit_)
m_callback(UI_RESULT_CLOSE_SETTING);
}
hg_settingdialog *hg_settingdialog::GetSettingDialog()
{
return hg_setting_ui_;
}
void hg_settingdialog::initUi()
{
updateOpt();

View File

@ -47,12 +47,11 @@ class hg_settingdialog : public QDialog
};
public:
explicit hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName,
explicit hg_settingdialog(class Manager *mgr, SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName,
std::function<void(ui_result)> callback, QWidget *parent = nullptr);
~hg_settingdialog();
public:
static hg_settingdialog *GetSettingDialog();
void initUi();
void updateOpt();
void createUI();
@ -82,7 +81,7 @@ public:
private:
gb::sane_config_schm* m_scheme;
static hg_settingdialog *hg_setting_ui_;
class Manager *m_mgr;
SANEAPI m_saneAPI;
SANE_Handle m_devHandle;
bool m_showScan;