C++ 使用ActiveX服务器调用QCoreApplication::arguments()时崩溃
我们正在构建一个包含一些QObject和QWidget的库。其想法是使用ActiveX(QAxContainer)提供COM对象,以便可以嵌入这些对象并与其他语言(在本例中为托管C#)结合使用 我们正在使用的一些对象将与QtQuick集成,为此,我们使用QQuickWidget。在QQuickWidget构造期间,它将调用QCoreApplication::arguments(),这将导致访问冲突读取:C++ 使用ActiveX服务器调用QCoreApplication::arguments()时崩溃,c++,qt,activex,C++,Qt,Activex,我们正在构建一个包含一些QObject和QWidget的库。其想法是使用ActiveX(QAxContainer)提供COM对象,以便可以嵌入这些对象并与其他语言(在本例中为托管C#)结合使用 我们正在使用的一些对象将与QtQuick集成,为此,我们使用QQuickWidget。在QQuickWidget构造期间,它将调用QCoreApplication::arguments(),这将导致访问冲突读取: WinClient.exe中0x00007ffc43f12fc0(ucrtbased.dll
WinClient.exe中0x00007ffc43f12fc0(ucrtbased.dll)处引发异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFF
将以下类导出到ActiveX小部件将导致崩溃:
#include <QWidget>
#include <ActiveQt/QAxBindable>
class TestAxWidget: public QWidget, public QAxBindable
{
Q_OBJECT
Q_CLASSINFO("ClassID", "{377794ac-85f2-4e2c-be17-f2852d85fa61}")
Q_CLASSINFO("InterfaceID", "{8b3a6ef3-9d17-47f7-99a8-cd96d0d922dd}")
Q_CLASSINFO("EventsID", "{12e9000e-017e-454e-a641-73c9p8349d77}")
Q_CLASSINFO("CoClassAlias", "TestAxWidget")
Q_CLASSINFO("RegisterObject", "yes")
public:
explicit TestAxWidget(QWidget * parent = Q_NULLPTR)
: QWidget(parent)
{
QCoreApplication::arguments();
}
Q_DISABLE_COPY(TestAxWidget)
};
对如何解决这个问题有什么建议吗
更新 在使用Qt源进行进一步调试之后,我发现提供给QCoreApplication()的
argc
被初始化为0(零)
调用QCoreApplication::arguments()时,argc的值已更改为某个随机高值!=0,这显然会导致异常
我在VS2015中使用了一个数据断点
来标识argc的值何时更改,并且它似乎是由clr.dll
定期更改的。我怎样才能防止这种情况?我是不是做错了什么
目前在Windows 10 x64 VS2015上使用Qt 5.6.2,我认为在不改变主应用程序的情况下解决这个问题的唯一方法是(我认为写的是C)是在库中创建QApplication实例,并运行QApplication::exec从QWidgets实例向QWidgets实例发送GUI消息。显然,当QApplication通过函数
CreateInstanceHelper:
...
if (!qApp) {
qax_ownQApp = true;
int argc = 0;
new QApplication(argc, 0);
}
...
应用程序崩溃,因为传入的参数argc
是在堆栈上创建的,并且不超过QApplication实例
在版本5.9.0中有一个错误修复程序:
似乎有点过分不?有时候,我很幸运地使用了编译后的二进制文件,这样strlen就不会抛出异常,然后它就可以正常工作了。是的,这是一个设计限制,所有小部件都必须在QApplications控制的唯一一个GUI线程中处理。我们在c#app中使用消息泵进行事件传递。请注意,例如创建一个标准的QWidget(而不是QQuickWidget),这不是一个问题。
...
if (!qApp) {
qax_ownQApp = true;
int argc = 0;
new QApplication(argc, 0);
}
...