C ++ Builder — C ++ — Builder: нарушение прав доступа 0x0000002c в window.cpp

Я изменяю программу в 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.

Ну, 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
(перейдите по ссылке, так как класс имеет очень большое объявление)

0

Решение

Можете ли вы проверить, правильно ли вы установили настройки проекта:
Существует опция для целочисленных перечислений, она должна быть включена
Выравнивание структур должно быть таким же, как в OWLNext, который по умолчанию составляет 8 байт.

Кроме того, вы можете собрать с включенным CodeGuard и посмотреть, если он сообщает о каких-либо проблемах?

Jogy

2

Другие решения

Итак, я до сих пор не знаю, как это было решено в деталях, но когда я планирую портировать его на vcl, я загрузил #include <vcl.h> в основном файле.

Я также заменил все TFileSaveDialog(handle, fileNameData)) с owl::TFileSaveDialog(NULL, fileNameData)),

И нет больше никаких проблем.

0

По вопросам рекламы [email protected]