繁体   English   中英

Q_OBJECT 宏在初始化时抛出“读取访问冲突”**priv**(...)

[英]Q_OBJECT macro throws "Read Access Violation " **priv**(...) on initialization

我继承了一个使用以下方法构建的项目:

  • Qt 5.7.1
  • 视觉 C++ 2017
  • .Net 框架 4.8.03761

在 Qt 方面,我远非专家,而且我的 google-fu 使我失败了。

情况:

我有一个作为 Qt 插件的项目。 在我的代码库中还有另外两个关于如何设置这些项目的示例,在初始化我的代码时会出现运行时错误,而其他代码几乎相同的示例则不会发生这种错误。

我的代码:

Enveloppe3DPlugin项目中,我有一个名为Enveloppe3DPlugin的类。 这是我遇到运行时错误的地方。

Enveloppe3DPlugin.h

#pragma once

#include <QObject>
#include "DllPlugin\BasePluginInterface.h"
class Enveloppe3DPlugin : public QLIO::BasePluginInterface
{
    Q_OBJECT
        Q_PLUGIN_METADATA(IID "org.LIO.MainWindow.BasePluginInterface" FILE "Enveloppe3DPlugin.json")
        Q_INTERFACES(QLIO::BasePluginInterface)

public:
    Enveloppe3DPlugin();
    virtual ~Enveloppe3DPlugin() {}
    virtual void initialize(LIO::Element* io_RootData, QLIO::Presenter* io_RootPresenter);
};

Enveloppe3DPlugin.cpp

#include "Enveloppe3DPlugin.h"

const QString PLUGIN_NAME = Enveloppe3DPlugin::tr("Enveloppe3DPlugin");

Enveloppe3DPlugin::Enveloppe3DPlugin()
    : BasePluginInterface(PLUGIN_NAME, QLIO::Enveloppe3DPluginPriority) { }

void Enveloppe3DPlugin::initialize(LIO::Element * io_RootData, QLIO::Presenter * io_RootPresenter) { }

moc_Enveloppe3DPlugin.cpp

/****************************************************************************
** Meta object code from reading C++ file 'Enveloppe3DPlugin.h'
**
** Created by: The Qt Meta Object Compiler version 67 (Qt 5.7.1)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#include "../../Enveloppe3DPlugin.h"
#include <QtCore/qbytearray.h>
#include <QtCore/qmetatype.h>
#include <QtCore/qplugin.h>
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'Enveloppe3DPlugin.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 67
#error "This file was generated using the moc from 5.7.1. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif

QT_BEGIN_MOC_NAMESPACE
struct qt_meta_stringdata_Enveloppe3DPlugin_t {
    QByteArrayData data[1];
    char stringdata0[18];
};
#define QT_MOC_LITERAL(idx, ofs, len) \
    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
    qptrdiff(offsetof(qt_meta_stringdata_Enveloppe3DPlugin_t, stringdata0) + ofs \
        - idx * sizeof(QByteArrayData)) \
    )
static const qt_meta_stringdata_Enveloppe3DPlugin_t qt_meta_stringdata_Enveloppe3DPlugin = {
    {
QT_MOC_LITERAL(0, 0, 17) // "Enveloppe3DPlugin"

    },
    "Enveloppe3DPlugin"
};
#undef QT_MOC_LITERAL

static const uint qt_meta_data_Enveloppe3DPlugin[] = {

 // content:
       7,       // revision
       0,       // classname
       0,    0, // classinfo
       0,    0, // methods
       0,    0, // properties
       0,    0, // enums/sets
       0,    0, // constructors
       0,       // flags
       0,       // signalCount

       0        // eod
};

void Enveloppe3DPlugin::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
    Q_UNUSED(_o);
    Q_UNUSED(_id);
    Q_UNUSED(_c);
    Q_UNUSED(_a);
}

const QMetaObject Enveloppe3DPlugin::staticMetaObject = {
    { &QLIO::BasePluginInterface::staticMetaObject, qt_meta_stringdata_Enveloppe3DPlugin.data,
      qt_meta_data_Enveloppe3DPlugin,  qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
};


const QMetaObject *Enveloppe3DPlugin::metaObject() const
{
    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}

void *Enveloppe3DPlugin::qt_metacast(const char *_clname)
{
    if (!_clname) return Q_NULLPTR;
    if (!strcmp(_clname, qt_meta_stringdata_Enveloppe3DPlugin.stringdata0))
        return static_cast<void*>(const_cast< Enveloppe3DPlugin*>(this));
    if (!strcmp(_clname, "org.LIO.MainWindow.BasePluginInterface/1.0"))
        return static_cast< QLIO::BasePluginInterface*>(const_cast< Enveloppe3DPlugin*>(this));
    return QLIO::BasePluginInterface::qt_metacast(_clname);
}

int Enveloppe3DPlugin::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QLIO::BasePluginInterface::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    return _id;
}

QT_PLUGIN_METADATA_SECTION const uint qt_section_alignment_dummy = 42;

#ifdef QT_NO_DEBUG

QT_PLUGIN_METADATA_SECTION
static const unsigned char qt_pluginMetaData[] = {
    'Q', 'T', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', ' ', ' ',
    'q',  'b',  'j',  's',  0x01, 0x00, 0x00, 0x00,
    0xb0, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
    0x9c, 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00,
    0x03, 0x00, 'I',  'I',  'D',  0x00, 0x00, 0x00,
    '&',  0x00, 'o',  'r',  'g',  '.',  'L',  'I', 
    'O',  '.',  'M',  'a',  'i',  'n',  'W',  'i', 
    'n',  'd',  'o',  'w',  '.',  'B',  'a',  's', 
    'e',  'P',  'l',  'u',  'g',  'i',  'n',  'I', 
    'n',  't',  'e',  'r',  'f',  'a',  'c',  'e', 
    0x1b, 0x0a, 0x00, 0x00, 0x09, 0x00, 'c',  'l', 
    'a',  's',  's',  'N',  'a',  'm',  'e',  0x00,
    0x11, 0x00, 'E',  'n',  'v',  'e',  'l',  'o', 
    'p',  'p',  'e',  '3',  'D',  'P',  'l',  'u', 
    'g',  'i',  'n',  0x00, ':',  0xe0, 0xa0, 0x00,
    0x07, 0x00, 'v',  'e',  'r',  's',  'i',  'o', 
    'n',  0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
    0x05, 0x00, 'd',  'e',  'b',  'u',  'g',  0x00,
    0x15, 0x12, 0x00, 0x00, 0x08, 0x00, 'M',  'e', 
    't',  'a',  'D',  'a',  't',  'a',  0x00, 0x00,
    0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
    0x80, 0x00, 0x00, 0x00, '@',  0x00, 0x00, 0x00,
    't',  0x00, 0x00, 0x00, 'd',  0x00, 0x00, 0x00
};

#else // QT_NO_DEBUG

QT_PLUGIN_METADATA_SECTION
static const unsigned char qt_pluginMetaData[] = {
    'Q', 'T', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', ' ', ' ',
    'q',  'b',  'j',  's',  0x01, 0x00, 0x00, 0x00,
    0xb0, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
    0x9c, 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00,
    0x03, 0x00, 'I',  'I',  'D',  0x00, 0x00, 0x00,
    '&',  0x00, 'o',  'r',  'g',  '.',  'L',  'I', 
    'O',  '.',  'M',  'a',  'i',  'n',  'W',  'i', 
    'n',  'd',  'o',  'w',  '.',  'B',  'a',  's', 
    'e',  'P',  'l',  'u',  'g',  'i',  'n',  'I', 
    'n',  't',  'e',  'r',  'f',  'a',  'c',  'e', 
    0x15, 0x0a, 0x00, 0x00, 0x08, 0x00, 'M',  'e', 
    't',  'a',  'D',  'a',  't',  'a',  0x00, 0x00,
    0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x9b, 0x0d, 0x00, 0x00,
    0x09, 0x00, 'c',  'l',  'a',  's',  's',  'N', 
    'a',  'm',  'e',  0x00, 0x11, 0x00, 'E',  'n', 
    'v',  'e',  'l',  'o',  'p',  'p',  'e',  '3', 
    'D',  'P',  'l',  'u',  'g',  'i',  'n',  0x00,
    '1',  0x00, 0x00, 0x00, 0x05, 0x00, 'd',  'e', 
    'b',  'u',  'g',  0x00, ':',  0xe0, 0xa0, 0x00,
    0x07, 0x00, 'v',  'e',  'r',  's',  'i',  'o', 
    'n',  0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
    '@',  0x00, 0x00, 0x00, '\\', 0x00, 0x00, 0x00,
    0x80, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00
};
#endif // QT_NO_DEBUG

QT_MOC_EXPORT_PLUGIN(Enveloppe3DPlugin, Enveloppe3DPlugin)

QT_END_MOC_NAMESPACE

基础插件接口.h

现在,BasePluginInterface 有更多内容,但没有其他抽象方法或任何其他需要在应用程序初始化时设置的内容。 我知道这一点是因为我在这个抽象类的每个方法中都放置了断点,并且在应用程序崩溃之前它们都没有被命中,并且因为基类适用于其他示例。

namespace QLIO
{
    class DLLPLUGIN_EXPORT BasePluginInterface : public QObject
    {
        Q_OBJECT

    public:
        BasePluginInterface( const QString& in_PluginName, PluginPriorityLoad in_Priority )
            : m_PluginName( in_PluginName )
            , m_LoadPriority( in_Priority )
            , m_StateMachine( nullptr )
        {}

        virtual ~BasePluginInterface()
        {}

        virtual void initialize( LIO::Element* io_RootData, QLIO::Presenter* io_RootPresenter ) = 0;

    protected:
        QString  m_PluginName;
        PluginPriorityLoad m_LoadPriority;
        QState* m_StateMachine;
    }
} 

Q_DECLARE_INTERFACE( QLIO::BasePluginInterface, "org.LIO.MainWindow.BasePluginInterface/1.0" )

Q_OBJECT行上引发了异常,说明(我从法语翻译了这个,我希望它是一个有意义的翻译)

引发的异常:发生了读取访问冲突 **priv**(...) 返回的 nullptr。

这是原始的法语信息,以防万一有人可以更好地翻译它:

例外 levée:违反 d'accès en 讲座。 **priv**(...) 返回 nullptr。 欧盟替代

堆栈跟踪:

Qt5Cored.dll!objectClassName(const QMetaObject * m) Ligne 306   C++
Qt5Cored.dll!QMetaObject::tr(const char * s, const char * c, int n) Ligne 375   C++
Enveloppe3DPlugin.dll!Enveloppe3DPlugin::tr(const char * s, const char * c, int n) Ligne 7  C++
Enveloppe3DPlugin.dll!`dynamic initializer for 'PLUGIN_NAME''() Ligne 3 C++
[Code externe]
Qt5Cored.dll!QLibraryPrivate::load_sys() Ligne 115  C++
Qt5Cored.dll!QLibraryPrivate::load() Ligne 538  C++
Qt5Cored.dll!QLibraryPrivate::loadPlugin() Ligne 591    C++
Qt5Cored.dll!QPluginLoader::load() Ligne 239    C++
Qt5Cored.dll!QPluginLoader::instance() Ligne 195    C++
DllPlugin.dll!PluginManager::PluginManager() Ligne 40   C++
SterLIO.exe!MainWindow::MainWindow(QWidget * parent) Ligne 78   C++
SterLIO.exe!main(int argc, char * * argv) Ligne 81  C++
SterLIO.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal) Ligne 123    C++
[Code externe]  

最后,因为我相信这可能是一个配置问题,这是我的 .cvxproj 的CustomBuild部分,与构建Enveloppe3DPlugin.h相关,如果需要,我倾向于发布完整的项目文件,但我认为问题,可能躺在那里:

<CustomBuild Include="Enveloppe3DPlugin.h">
  <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
  <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing Enveloppe3DPlugin.h...</Message>
  <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
  <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -D_WINDOWS -DUNICODE -DWIN32 -DQT_PLUGIN -DQT_CORE_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_DLL -D_WINDLL "-I.\..\..\MainWindow\PluginManager" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include\QtGui" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include\QtCore" "-I.\debug" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\mkspecs\win32-msvc2013" "-I.\GeneratedFiles" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui"</Command>
  <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
  <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing Enveloppe3DPlugin.h...</Message>
  <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
  <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -D_WINDOWS -DQT_CORE_LIB -DQT_PLUGIN -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_DLL "-DTEST_DATA_PATH=$(FLAVATestDataDir)\." -D_WINDLL "-I.\..\..\..\QtLibraries" "-I.\..\..\..\..\LIOAlgorithms\Sources" "-I$(TPDir)\." "-I$(EigenDir)\." "-I$(PugiXmlDir)\." "-I$(NanoFlannDir)\." "-I$(PNGDir)\." "-I$(PNGDir)\scripts" "-I$(PngCppDir)\." "-I$(GDCMDir)\include" "-I$(GlewDir)\Include" "-I$(BoostDir)\." "-I$(CryptoDir)\." "-I$(TPDir)\libigl\include" "-I$(TPDir)\fftw\fftw-3.3.4\api" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui"</Command>
  <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
  <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing Enveloppe3DPlugin.h...</Message>
  <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
  <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -D_WINDOWS -DUNICODE -DWIN32 -DQT_NO_DEBUG -DQT_PLUGIN -DQT_CORE_LIB -DNDEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_DLL -D_WINDLL "-I.\..\..\MainWindow\PluginManager" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include\QtGui" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\include\QtCore" "-I.\release" "-IC:\qt\qt5.4.0\5.4\msvc2013_64_opengl\mkspecs\win32-msvc2013" "-I.\GeneratedFiles" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui"</Command>
  <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
  <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing Enveloppe3DPlugin.h...</Message>
  <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
  <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -D_WINDOWS -DNDEBUG -DQT_CORE_LIB -DQT_NO_DEBUG -DQT_PLUGIN -DUNICODE -DWIN32 -DWIN64 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_DLL "-DTEST_DATA_PATH=$(FLAVATestDataDir)\." -D_WINDLL "-I.\..\..\..\QtLibraries" "-I.\..\..\..\..\LIOAlgorithms\Sources" "-I$(TPDir)\." "-I$(EigenDir)\." "-I$(PugiXmlDir)\." "-I$(NanoFlannDir)\." "-I$(PNGDir)\." "-I$(PNGDir)\scripts" "-I$(PngCppDir)\." "-I$(GDCMDir)\include" "-I$(GlewDir)\Include" "-I$(BoostDir)\." "-I$(CryptoDir)\." "-I$(TPDir)\libigl\include" "-I$(TPDir)\fftw\fftw-3.3.4\api" "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui"</Command>
</CustomBuild>

以及项目文件的ProjectExtensions部分:

<ProjectExtensions>
  <VisualStudio>
    <UserProperties UicDir=".\GeneratedFiles" RccDir=".\GeneratedFiles" Qt5Version_x0020_x64="$(DefaultQtVersion)" />
  </VisualStudio>
</ProjectExtensions>

在过去的几天里,我已经搜索了很多导致我的问题的原因,但我无法弄清楚,即使这个最小的例子也不起作用,尽管我应该提到代码确实在Release模式下运行,但插件没有不加载我的应用程序。

那么,这个不那么自我解释的异常的原因是什么?

问题是当我在Debug模式下运行时,我需要排除从Release生成的文件,反之亦然,导致了这个解决方案:

<ClCompile Include="GeneratedFiles\Debug\moc_Enveloppe3DPlugin.cpp">
  <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
  <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_Enveloppe3DPlugin.cpp">
  <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
  <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
</ClCompile>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM