Я изменяю программу в 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
(перейдите по ссылке, так как класс имеет очень большое объявление)
Можете ли вы проверить, правильно ли вы установили настройки проекта:
Существует опция для целочисленных перечислений, она должна быть включена
Выравнивание структур должно быть таким же, как в OWLNext, который по умолчанию составляет 8 байт.
Кроме того, вы можете собрать с включенным CodeGuard и посмотреть, если он сообщает о каких-либо проблемах?
Jogy
Итак, я до сих пор не знаю, как это было решено в деталях, но когда я планирую портировать его на vcl, я загрузил #include <vcl.h>
в основном файле.
Я также заменил все TFileSaveDialog(handle, fileNameData))
с owl::TFileSaveDialog(NULL, fileNameData))
,
И нет больше никаких проблем.