我们有一组用C ++ for Windows编写的DLL,这些DLL由C#应用程序使用,所有这些都包含在Visual Studio解决方案中。现在有人将DLL移植到Qt,因此可以在其他操作系统上使用它们。我可以在我的解决方案中切换到Qt代码并继续使用C#应用程序吗?或者我必须分成两个解决方案吗?
我已经尝试过这样做,但是当我尝试构建时,我得到了错误
“操作无法完成。参数不正确”
或
“无法执行请求的操作,因为已经内置了 进展“
仅供参考,我正在为VS2010使用Qt V4.8.0预建二进制文件。
答案 0 :(得分:0)
我们正在开发一个C ++项目,其中包括使用Qt构建的DLL和不知道Qt存在的DLL。这在VS2010中构建得很好,但是我们没有使用qmake来构建Qt项目;它一直是MSBUILD,我们必须专门运行某些可执行文件,qmake“神奇地”运行作为构建的一部分(如moc)。
也就是说,由于我们根据商业代码构建我们自己的二进制文件而不是使用预构建的二进制文件,因此可能会略有不同。
答案 1 :(得分:0)
事实证明,当我的同事完成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 ++)。