2012-02-10 115 views
0

我们有一组使用C++编写的用于Windows的C++应用程序所使用的DLL,所有这些都封装在Visual Studio解决方案中。现在有人将DLL移植到Qt中,以便可以在其他操作系统上使用它们。我可以在我的解决方案中切换到Qt代码并继续使用C#应用程序吗?或者我将不得不分裂成两个解决方案?我可以在Visual Studio 2010中混合使用Qt和非Qt项目吗?

我试着已经这样做了,但是当我尝试建立我得到

错误“的操作无法完成,该参数不正确”

“无法执行请求的操作,因为内置已在 进度中”

仅供参考,我在VS2010中使用Qt V4.8.0预编译的二进制文件。

回答

0

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

一旦我们解决这个问题,构建工作正常,但运行它并没有做任何事情 - C++ DLL从来没有响应过。最终我意识到,为了Qt定时器和队列的工作,我们不得不在DLL中调用QCoreApplication,因为我们没有使用Qt UI。但是,由于有一些Qt UI使用相同的DLL,所以如果UI已经调用了QApplication,我们不能总是调用QCoreApplication。您可以使用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++)。

0

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

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

相关问题