我正在修改C ++ Builder XE2中的程序。该程序尚未使用vcl,但使用owlnext。并包含多个MDI子窗体。

在那里,我使用例程来加载文件并打开一个新窗口。

在此例程中一切正常(我在调试模式下逐行跟踪了多次),但是当它完成并且PumpWaitingMessages() // pumps any waiting messages, idleCount=0再次完成并且TApplication::MessageLoop()进入下一个循环并调用IdleAction(idleCount++)时,该MainWindow->IdleAction(idleCount)调用TWindow::IdleAction(idleCount)这是window.h的函数,程序崩溃。

在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对象似乎无效...我也找不到包含地址0x0000002c的任何变量。

标题和父项为NULL,句柄为0x00000004,但其他值对我来说似乎合法...尽管奇怪的是,当检查cursormodule.name时,它告诉我E2122 Function call terminated by unhandled exception 0xc0000005 at address 0x408b1a

因此,有人知道为什么会发生此错误,或者我可以做什么或撤消以使其正常工作吗?

编辑:
win-> next是一个猫头鹰函数,定义为

//
/// 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
(由于类的声明非常大,请点击链接)

最佳答案

您可以检查是否正确设置了项目设置:
整数枚举有一个选项,必须将其打开
结构对齐方式必须与OWLNext中的对齐方式相同-默认情况下为8字节。

另外,您可以在启用CodeGuard的情况下进行构建并查看其是否报告任何问题吗?

欢乐

关于c++ - C++-Builder:window.cpp中的访问冲突0x0000002c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16190807/

10-12 23:40