Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用ActiveX服务器调用QCoreApplication::arguments()时崩溃_C++_Qt_Activex - Fatal编程技术网

C++ 使用ActiveX服务器调用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

我们正在构建一个包含一些QObject和QWidget的库。其想法是使用ActiveX(QAxContainer)提供COM对象,以便可以嵌入这些对象并与其他语言(在本例中为托管C#)结合使用

我们正在使用的一些对象将与QtQuick集成,为此,我们使用QQuickWidget。在QQuickWidget构造期间,它将调用QCoreApplication::arguments(),这将导致访问冲突读取:
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);
}
...