我有应用程序退出时提供异常的应用程序。 Callstack显示,当调用CoUnintialize时,异常来自CComPtr :: release。
> ieframe.dll!ATL::CComPtr<IWebBrowser2>::Release() + 0x5b bytes
ieframe.dll!CConnectionPoint::UnadviseAll() + 0x131d0 bytes
ieframe.dll!CConnectionPoint::~CConnectionPoint() + 0x18 bytes
ieframe.dll!CShellOcx::~CShellOcx() + 0xf7 bytes
ieframe.dll!CWebBrowserOC::`scalar deleting destructor'() + 0x14 bytes
ieframe.dll!CAggregatedUnknown::CUnkInner::Release() + 0x474a1 bytes
ole32.dll!CStdIdentity::ReleaseCtrlUnk() Line 1149 C++
ole32.dll!CStdMarshal::Disconnect(unsigned long dwType) Line 3454 C++
ole32.dll!CStdMarshal::DisconnectAndRelease(unsigned long dwType) Line 3161 + 0x11 bytes C++
ole32.dll!COIDTable::ThreadCleanup() + 0x31bed bytes C++
ole32.dll!FinishShutdown() Line 1035 C++
ole32.dll!ApartmentUninitialize(int fHostThread) Line 1291 C++
ole32.dll!wCoUninitialize(COleTls & Tls, int fHostThread) Line 2709 + 0x7 bytes C++
ole32.dll!CoUninitialize() Line 2632 C++
imm32.dll!000007feff3832f2()
[Frames below may be incorrect and/or missing, no symbols loaded for imm32.dll]
msctf.dll!000007fefeea7d59()
ntdll.dll!RtlProcessFlsData() + 0x84 bytes
ntdll.dll!LdrShutdownThread() + 0x4b bytes
ntdll.dll!RtlExitUserThread() + 0x38 bytes
IEShims.dll!NS_CreateThread::DesktopIE_ThreadProc() + 0xd6 bytes
kernel32.dll!BaseThreadInitThunk() + 0xd bytes
ntdll.dll!RtlUserThreadStart() + 0x21 bytes
例外是访问冲突
你们面对这样的情况吗?我可以申请什么样的根本原因? 到现在为止我已经完成了
答案 0 :(得分:0)
这很可能是因为错误的对象释放顺序。请考虑以下示例:COM对象A意味着拥有COM对象B,因此预期的顺序是对象A在其上显式调用Release()
,在析构函数中它将在对象B上调用Release()
。当CoUnintialize()
被调用时,COM将强制释放某些序列中的所有COM对象。所以有可能首先将对象B称为Release()
,现在对象A拥有一个指向它认为对象B的悬空指针,所以当对象A Release()
被调用时,它试图利用悬空指针并遇到未定义的行为。
解决方案所以这个问题是在调用CoUnintialize()
之前以正确的顺序显式释放对象。
答案 1 :(得分:0)
我有这个问题,红色后
http://mfctips.com/2012/10/29/cfiledialogdomodal-causes-access-violation/
我怀疑问题是将QFileDialog作为我的Qmainwindow方法的局部变量。然后我解决了它把我的Qfiledialog作为QMainwindow的私人成员,像这样:
//在MainWindow.h中
class MainWindow : public QMainWindow
{
Q_OBJECT
......
private:
......
QFileDialog *ptDialog;
.....
}
所以我在MainWindow构造函数中给ptDialog一个新的QfileDialog,并根据我在MainWindow方法中的需要调用ptDialog-&gt; exec(),如下所示:
//在MainWindow.cpp中
//构造
MainWindow::MainWindow(QWidget *parent):
QMainWindow(parent),
ui(new Ui::MainWindow)
{
.....
ptDialog=new QFileDialog(this, tr("Abrir Imagem"),QCoreApplication::applicationDirPath(), "Imagens (*.png *.jpg *.jpeg *.bmp)");
......
}
//我想使用QFileDialog
的任何方法void MainWindow::LoadFile()
{
if(ptDialog->exec())
{
SetFile(ptDialog->selectedFiles().first());
}
}
我认为,这样,Qmainwindow将仅在应用程序端发布,避免出现问题。