[英]Q_OBJECT macro throws "Read Access Violation " **priv**(...) on initialization
我繼承了一個使用以下方法構建的項目:
在 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.