我可以在Visual Studio 2010中混合使用Qt和非Qt项目吗

本文关键字:Qt 和非 项目 混合 Visual Studio 2010 我可以 | 更新日期: 2023-09-27 18:24:08

我们有一组用C++for Windows编写的DLL,供C#应用程序使用,所有这些都包含在Visual Studio解决方案中。现在有人已经将DLL移植到Qt,这样它们就可以在其他操作系统上使用。我可以在我的解决方案中切换到Qt代码并继续让它与C#应用程序一起工作吗?还是我必须分成两个解决方案?

我已经尝试过这样做了,但当我尝试构建时,我会得到错误

"操作无法完成。参数不正确"

"无法执行请求的操作,因为已在中生成进度"

仅供参考,我使用的是VS2010的Qt V4.8.0预构建二进制文件。

我可以在Visual Studio 2010中混合使用Qt和非Qt项目吗

我们有一个C++项目正在进行中,它既包括用Qt构建的DLL,也包括不知道Qt存在的DLL。这在VS2010中构建得很好,但我们没有使用qmake来构建Qt项目;它一直是MSBUILD,我们必须专门运行qmake"神奇地"作为构建的一部分运行的某些可执行文件(如moc)。

也就是说,当我们基于商业代码构建自己的二进制文件集而不是使用预构建的二进制文件时,可能会有一些细微的差异。

事实证明,当我的同事完成Qt端口时,他重新创建了一些Visual Studio项目文件,这导致它们与原始文件具有不同的GUID。当我切换到Qt端口时,GUID与C#项目列出的依赖项不匹配。Visual Studio在处理(或告诉你)这方面有点糟糕,所以你会得到上面列出的错误。

一旦我们修复了这个问题,构建就可以正常工作,但运行它什么都没做——C++DLL从来没有响应。最终我意识到,为了让Qt计时器和队列工作,我们必须在DLL中调用QCoreApplication,因为我们没有使用Qt UI。然而,由于有一些Qt UI使用相同的DLL,我们不能总是调用QCoreApplication,以防UI已经调用了QApplication。您可以使用QCoreApplication::instance()来检查是否需要调用,但不能在DLL_PROCESS_ATTACH上的DllMain()中执行此操作,因为首先这还为时过早,其次这是Windows特有的。所以我们想出了这个:

static struct Vars
{
    QCoreApplication    *l_pQt;
    bool                l_bQtCoreCreated;
    Vars()
        : l_pQt(NULL), l_bQtCoreCreated(false)
    {
    }
    virtual ~Vars()
    {
        if (l_pQt != NULL)
        {
            if (l_bQtCoreCreated)
            {
                delete l_pQt;
            }
            l_pQt = NULL;
            l_bQtCoreCreated = false;
        }
    }
} g_private;

static void InitQtCore(void)
{
    if (g_private.l_pQt == NULL)
    {
        g_private.l_pQt = QCoreApplication::instance();
        if (g_private.l_pQt == NULL)
        {
            g_private.l_bQtCoreCreated = true;
            int argc = 0;
            char    *argv = NULL;
            g_private.l_pQt = new QCoreApplication(argc, &argv);
        }
    }
}

DLL中任何不只是基本设置的函数都会在一开始调用InitQtCore()。这适用于Qt和非Qt UI(C#和C++)。