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的主要内容,如果未能解决你的问题,请参考以下文章

delphi 和 C++ Builder 中的组件?

从 C++ 如何执行 C 中的方法或访问结构?

C++Builder (RAD Studio) 中的范围检查错误

如何对 Delphi/C++Builder 中的设计时包进行故障排除?

停止 C++Builder XE 删除/编辑 .dfm 文件中的 UI 组件

如何解决 C++Builder 中的链接器错误“LIBCURL.LIB 包含无效的 OMF 记录,类型 0x21(可能是 COFF)”?