C++-builder:window.cpp 中的访问冲突 0x0000002c
Posted
技术标签:
【中文标题】C++-builder:window.cpp 中的访问冲突 0x0000002c【英文标题】:C++-builder: access violation 0x0000002c in window.cpp 【发布时间】:2013-04-24 11:28:55 【问题描述】:我正在修改 C++ Builder XE2 中的程序。该程序还没有使用 vcl,而是使用 owlnext。并包含多个 MDI-child-forms。
我使用例程加载文件并打开一个新窗口。
在这个例程中一切正常(我在调试模式下逐行跟踪它多次),但是当它完成并且PumpWaitingMessages() // pumps any waiting messages, idleCount=0
再次完成并且TApplication::MessageLoop()
进入下一个循环并调用IdleAction(idleCount++)
时调用MainWindow->IdleAction(idleCount)
调用window.h的函数TWindow::IdleAction(idleCount)
,程序崩溃。
在 IdleAction 中,应用程序在调用 win->IdleAction(idleCount)
时在第一个循环中崩溃,但以下情况除外:
First chance exception at $004E4CA4. Exception class $C0000005 with message 'access violation at 0x004e4ca4: read of address 0x0000002c'. Process Project2.exe (3772)
函数在 Owlnext 中定义如下:
//
/// Called when no messages are waiting to be processed, IdleAction performs idle
/// processing as long as true is returned. idleCount specifies the number of times
/// idleAction has been called between messages.
///
/// Propagate idle action to all children if count==0, and to any children that
/// previously said they wanted more time.
//
bool
TWindow::IdleAction(long idleCount)
bool wantMore = false;
TWindow* win = GetFirstChild();
if (win)
do
if (idleCount == 0 || win->IsFlagSet(wfPropagateIdle))
if (win->IdleAction(idleCount))
win->SetFlag(wfPropagateIdle);
wantMore = true;
else
win->ClearFlag(wfPropagateIdle);
win = win->Next();
while (win && win != GetFirstChild());
return wantMore;
我的猜测是窗口的句柄无效,但是win-object似乎没有无效...我也找不到任何包含0x0000002c地址的变量。
好吧,title 和 parent 为 NULL,Handle 为 0x00000004,但其他值对我来说似乎是合法的......但奇怪的是,当检查 cursormodule.name 时它告诉我E2122 Function call terminated by unhandled exception 0xc0000005 at address 0x408b1a
那么,有人知道为什么会发生此错误,或者我可以做什么或撤消以使其正常工作吗?
编辑: win->next 是一个 owl 函数,定义为
//
/// Returns a pointer to the next sibling window in the window's sibling list.
inline TWindow* TWindow::Next()
return SiblingList;
TWindow* SiblingList;
作为 TWindow 的私有
TWindow 声明如下:http://pastebin.com/TzTp4ZXh
(请点击链接,因为该类的声明非常大)
【问题讨论】:
0x2c 可能是您尝试通过空指针访问的 TWindow 中某个字段的偏移量。你有 TWindow 的声明吗? 你如何声明你的TWindow.Next()
方法?
@KristerAndersson 感谢您的评论!我已将定义编辑到上述问题中。
@Rup 它是一个标准的 owl 库,我在上面的帖子中链接了一份声明的副本!
C++ Builder 编译器存在内联函数问题。如果在调试模式下调用它们,它们可能会损坏堆栈。这可能导致堆栈溢出或访问冲突。应用程序可能会在问题功能中或此后不久崩溃。我不知道这是不是你的问题。在我的一个项目中,我能够通过禁用项目选项中的内联函数来解决神秘的崩溃。在汇编器中调试表明堆栈可能已损坏,导致无限递归。
【参考方案1】:
您能否检查您是否正确设置了项目设置: 整数大小的枚举有一个选项,它必须打开 结构对齐必须与 OWLNext 中的相同 - 默认为 8 个字节。
另外,您能否在启用 CodeGuard 的情况下构建并查看它是否报告任何问题?
乔吉
【讨论】:
感谢您的回复,但一切设置正确。 CodeGuard 似乎一直处于启用状态,所以没有其他消息...【参考方案2】:所以,我仍然不太清楚这是如何详细解决的,但由于我计划将其分段移植到 vcl,我在主文件中加载了 #include <vcl.h>
。
我还将所有TFileSaveDialog(handle, fileNameData))
替换为owl::TFileSaveDialog(NULL, fileNameData))
。
不,没有任何问题了。
【讨论】:
以上是关于C++-builder:window.cpp 中的访问冲突 0x0000002c的主要内容,如果未能解决你的问题,请参考以下文章
C++Builder (RAD Studio) 中的范围检查错误
如何对 Delphi/C++Builder 中的设计时包进行故障排除?
停止 C++Builder XE 删除/编辑 .dfm 文件中的 UI 组件
如何解决 C++Builder 中的链接器错误“LIBCURL.LIB 包含无效的 OMF 记录,类型 0x21(可能是 COFF)”?