pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

在非 Qt 應(yīng)用程序中使用基于 Qt 的 DLL

Using a Qt-based DLL in a non-Qt application(在非 Qt 應(yīng)用程序中使用基于 Qt 的 DLL)
本文介紹了在非 Qt 應(yīng)用程序中使用基于 Qt 的 DLL的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

我做對了嗎?

我的一個客戶有一個小組,我在那里開發(fā)基于 Qt 的客戶端-服務(wù)器內(nèi)容,其中包含許多有趣的小部件和套接字.

A client of mine has a group where I'm developing Qt-based client-server stuff with a lot of fun widget stuff and sockets.

公司內(nèi)的另一個小組想要使用基于 QTcpSocket 的客戶端數(shù)據(jù)提供程序類的包裝版本.(基本上就是它聽起來的樣子,從服務(wù)器向客戶端顯示提供數(shù)據(jù))

Another group within the company wants to use a wrapped version of the QTcpSocket-based client data provider classes. (Which does basically what it sounds like, provides data from the server to the client displays)

但是,該小組有一個主要使用 MFC 構(gòu)建的龐大應(yīng)用程序,而且這種情況在短期內(nèi)不會改變.基于 Qt 的 DLL 也是延遲加載的,因此在某些配置中可以在沒有此功能的情況下部署它.

However, that group has a huge application built mostly with MFC, and that is simply not going to change any time soon. The Qt-based DLL is also delay-loading so that it can be deployed without this feature in certain configurations.

我已經(jīng)讓它工作了,但它有點hacky.這是我目前的解決方案:

I've got it working, but it's a little hacky. Here's my solution at the moment:

DLL 包裝類構(gòu)造函數(shù)調(diào)用 QCoreApplication::instance() 來查看它是否為 NULL.如果它為 NULL,則假定它在非 Qt 應(yīng)用程序中,并創(chuàng)建它自己的 QCoreApplication 實例:

The DLL wrapper class constructor calls QCoreApplication::instance() to see if it's NULL or not. If it's NULL, it assumes it's in a non-Qt app, and creates a QCoreApplication instance of it's own:

if (QCoreApplication::instance() == NULL)
{
    int argc = 1;
    char* argv[] = { "dummy.exe", NULL };
    d->_app = new QCoreApplication(argc, argv);  // safe?
}
else
    d->_app = NULL;

然后它會設(shè)置一個windows定時器來偶爾調(diào)用processEvents():

It then will set up a windows timer to occasionally call processEvents():

if (eventTimerInterval > 0)
{
    // STATE: start a timer to occasionally process the Qt events in the event queue
    SetTimer(NULL, (UINT_PTR)this, eventTimerInterval, CDatabaseLayer_TimerCallback);
}

回調(diào)只是使用 timerID 作為指向類實例的指針來調(diào)用 processEvents() 函數(shù).SetTimer() 文檔說,當(dāng) HWND 為 NULL 時,它會忽略 timerID,因此這似乎是完全有效的.

The callback simply calls the processEvents() function using the timerID as a pointer to the class instance. The SetTimer() docs say when HWND is NULL it ignores the timerID, so this appears to be perfectly valid.

VOID CALLBACK BLAHBLAH_TimerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    ((BLAHBLAH*)idEvent)->processEvents(); // basically just calls d->_app->processEvents();
}

然后我銷毀 QCoreApplication 實例作為析構(gòu)函數(shù)中的最后一件事.

I then destroy the QCoreApplication instance as the very last thing in the destructor.

BLAHBLAH::~BLAHBLAH()
{
    .. other stuff

   QCoreApplication* app = d->_app;
   d->_app = NULL;
   delete d;
   if (app != NULL)
       delete app;
}

如果托管應(yīng)用程序希望自己對 processEvents() 的調(diào)用計時,它可以為 eventTimerInterval 傳遞 0 并調(diào)用 BLAHBLAH::processEvents() 本身.

If the hosting application wishes to time the calls to processEvents() itself, it can pass 0 in for eventTimerInterval and call BLAHBLAH::processEvents() itself.

對此有什么想法嗎?將該應(yīng)用程序移植到 Qt 不是一種選擇.這不是我們的.

Any thoughts on this? Porting that app to Qt is not an option. It's not ours.

它似乎有效,但這里可能有幾個假設(shè)被打破.我可以用這樣的虛擬參數(shù)構(gòu)造一個 QCoreApplication 嗎?事件隊列以這種方式運行是否安全?

It appears to work, but there are probably several assumptions being broken here. Can I just construct a QCoreApplication with dummy arguments like that? Is the event queue safe to operate in this manner?

我不想以后這件事在我臉上炸開.想法?

I don't want this blowing up in my face later. Thoughts?

推薦答案

研究 Qt 代碼,似乎需要 QCoreApplication 來調(diào)度系統(tǒng)范圍的消息,例如計時器事件.諸如信號/插槽甚至 QThread 之類的東西都不依賴于它,除非它們與那些系統(tǒng)范圍的消息相關(guān).這是我在共享庫中執(zhí)行此操作的方法(以跨平臺方式使用 Qt 本身)并且我實際上確實調(diào)用了 exec,因為 processEvents() 本身并不能處理所有內(nèi)容.

Studying the Qt code it seems QCoreApplication is needed to dispatch system-wide messages such as timer events. Things like signal/slots and even QThreads do not depend on it unless they are related to those system-wide messages. Here is how I do this in a shared library (in a cross platform way using Qt itself) and I actually do call exec, because processEvents() alone does not process everything.

我有一個全局命名空間:

I have a global namespace:

// Private Qt application
namespace QAppPriv
{
    static int argc = 1;
    static char * argv[] = {"sharedlib.app", NULL};
    static QCoreApplication * pApp = NULL;
    static QThread * pThread = NULL;
};

我在 QObject 中有一個 OpenApp 方法(即 moc'ed),如下所示:

I have an OpenApp method in a QObject (that is moc'ed) like this:

// Initialize the app
if (QAppPriv::pThread == NULL)
{
    // Separate thread for application thread
    QAppPriv::pThread = new QThread();
    // Direct connection is mandatory
    connect(QAppPriv::pThread, SIGNAL(started()), this, SLOT(OnExec()), Qt::DirectConnection);
    QAppPriv::pThread->start();
}

這里是 OnExec 插槽:

if (QCoreApplication::instance() == NULL)
{
    QAppPriv::pApp = new QCoreApplication(QAppPriv::argc, QAppPriv::argv);
    QAppPriv::pApp->exec();
    if (QAppPriv::pApp)
        delete QAppPriv::pApp;
}

到目前為止它似乎工作正常,我不確定最后是否需要刪除該應(yīng)用程序,如果我發(fā)現(xiàn)了什么我會更新我的答案.

So far it seems to be working fine, I am not sure if I need to delete the app at the end, I will update my answer if I find something.

這篇關(guān)于在非 Qt 應(yīng)用程序中使用基于 Qt 的 DLL的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How to make a .lib file when have a .dll file and a header file(有.dll文件和頭文件時如何制作.lib文件)
Convert std::string to QString(將 std::string 轉(zhuǎn)換為 QString)
Gui toolkits, which should I use?(Gui 工具包,我應(yīng)該使用哪個?)
How to avoid entering library#39;s source files while debugging in Qt Creator with gdb?(使用gdb在Qt Creator中調(diào)試時如何避免進入庫的源文件?)
Starting QTimer In A QThread(在 QThread 中啟動 QTimer)
Making a borderless window with for Qt(使用 for Qt 制作無邊框窗口)
主站蜘蛛池模板: 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | IPO咨询公司-IPO上市服务-细分市场研究-龙马咨询 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 长城人品牌官网 | 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | PE一体化污水处理设备_地埋式生活污水净化槽定制厂家-岩康塑业 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 南京办公用品网-办公文具用品批发-打印机耗材采购 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 【法利莱住人集装箱厂家】—活动集装箱房,集装箱租赁_大品牌,更放心 | Boden齿轮油泵-ketai齿轮泵-yuken油研-无锡新立液压有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 100国际学校招生 - 专业国际学校择校升学规划 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 浙江上沪阀门有限公司| 同学聚会纪念册制作_毕业相册制作-成都顺时针宣传画册设计公司 | 臭氧灭菌箱-油桶加热箱-原料桶加热融化烘箱-南京腾阳干燥设备厂 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 道康宁消泡剂-瓦克-大川进口消泡剂供应商| 德国UST优斯特氢气检漏仪-德国舒赐乙烷检测仪-北京泽钏 | 机械加工_绞车配件_立式离心机_减速机-洛阳三永机械厂 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测 | 水性漆|墙面漆|木器家具漆|水漆涂料_晨阳水漆官网 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 蜗轮丝杆升降机-螺旋升降机-丝杠升降机厂家-润驰传动 |