Qt导入MFC工程的lib库和dll等库之后,编译出现错误,如何解决?

图片说明

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 请看👉 :DLL中封装Qt窗口给MFC或Qt应用程序调用,并将DLL中的窗口嵌入主程序中,实现与主程序交互和自身事件循环的解决方案
  • 除此之外, 这篇博客: DLL中封装Qt窗口给MFC或Qt应用程序调用,并将DLL中的窗口嵌入主程序中,实现与主程序交互和自身事件循环的解决方案中的 2、MFC作为主程序调用dll 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    我们知道,一般性的Qt应用程序,是有自己的事件循环,在main()函数中,一般情况下会这样写代码:

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWidget w;
        w.show();
        return a.exec();
    }

    当调用a.exec()后,主程序就会阻塞在这里,并且开启Qt自身的消息循环和处理。那么如果想在dll中嵌入Qt界面并实现Qt正常的工作,就必然少不了在dll中实现Qt事件循环,包括QApplication::exec()的调用。

    所以在MFC调用dll之前,dll不仅仅是需要创建内部的Qt界面或者控件,而且也需要开启Qt的事件循环,最简单的方法就是开启单独的一个线程,用来作为Qt的事件循环。具体的实现就是初始化dll的接口中开启一个线程,在该线程中实现如下代码: 

    int argc = 1;
    TCHAR targv[MAX_PATH] = { 0 };
     GetModuleFileName(NULL, targv, MAX_PATH);
    USES_CONVERSION;
    std::string strPath = T2A(targv);
    char argv[MAX_PATH];
    memcpy(argv, strPath.c_str(), strPath.length());
    char* pargv = argv;
    QApplication* a= new QApplication(argc, &pargv);
    // 这里创建dll内部的Qt界面例如QWidget
    QWidget w;
    w.show();
    a.exec();

    当调用a.exec()之后,该线程就被阻塞在这里,该线程就是实现QWidget的事件循环的线程动力。当需要结束这个事件循环,或者关闭这个dll中界面时,我们需要调用a->quit();来结束QApplication。

    以上是MFC作为主程序来调用dll的实现。

     


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^