事实证明,当我的同事完成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++)。