Ошибка подтверждения - PullRequest
2 голосов
/ 15 апреля 2009

В vc ++ 6.0 MFC Application Project я не получу ошибку компиляции, но при запуске проекта я получу ошибку

Debug Assertion Failed!
program:project.exe
File:winocc.cpp
Line:345

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

что это за ошибка и почему возникает этот тип ошибки, как отладить эту ошибку, плз, помогите любому телу,

Ответы [ 4 ]

6 голосов
/ 15 апреля 2009

Вы, вероятно, обнаружите утверждение в winocc.cpp в строке 345. Посмотрите на этот исходный файл, чтобы увидеть, что он проверяет (что не следует делать), а затем прекратите это делать :-)

Если у вас нет исходного кода, вам придется либо:

  • свяжитесь с тем, кто написал это, и выясните, что это за утверждение; или
  • прочитайте документацию по API, чтобы увидеть, что вы делаете что-то не так.

Утверждение - это время выполнения проверки того, используется ли кодер для обеспечения соблюдения правил или возникновения неожиданных ситуаций до того, как будет нанесен какой-либо реальный ущерб. Такие вещи, как двусвязный список, становятся поврежденными (например, что-то вроде assert (x-> next-> prev! = X), что создаст проблему, если предыдущий узел узла A не имеет узла A в качестве следующего узла).

Что-то вроде:

Assert (p1 == NULL);

(на моем мифическом языке, если у меня неправильный синтаксис C) в начале функции будет выдано утверждение, если p1 равно NULL.

Поиск в сети приводит к появлению следующей строки 345 (см. здесь ):

ASSERT (m_pCtrlSite! = NULL); // не элемент управления OLE (по крайней мере, пока).

и, похоже, проблема в том, что вы пытаетесь динамически создать лицензионный элемент управления ActiveX. Эта ссылка также содержит номер КБ Q151804, в котором говорится, что он разработан (что означает, что MS, вероятно, не исправит его) - вам нужно создать элемент управления с действующей строкой лицензии.

Еще один найденный мной комментарий гласит:

Недостаточно просто создать экземпляр элемента управления ActiveX. Элемент управления ActiveX должен быть правильно размещен, прежде чем его можно будет использовать. Твой нет. Вы должны, скажем, поместить его в диалог и создать экземпляр этого диалога.

Не видя остальной части вашего кода, трудно сказать, является ли это вашей конкретной проблемой, но если ваша строка 345 - это та, которая мне кажется, это имеет смысл - жаловаться, что контроль сайт имеет значение NULL (т. е. элемент управления не размещен).

И последнее, на что нужно обратить внимание:

Если ваш элемент управления ActiveX равен в диалоговом окне, вы пытаетесь что-то сделать с элементом управления до того, как вызовете диалоговое окно DoModal()?

Элемент управления будет инициализирован только после того, как вы позвоните DoModal(), поэтому вы не сможете играть с элементом управления до тех пор, пока это не произойдет. Вы должны сделать это в диалоговых окнах OnInitDialog() - в этот момент элемент управления должен быть полностью инициализирован, и вы можете делать с ним все, что хотите.

Если вы пытаетесь использовать параметры из конструктора диалогов для управления элементом управления, вам необходимо сохранить их где-то в диалоговом окне 1054 * и передать их в элемент управления в OnInitDialog().

Эта информация была собрана в основном из здесь .

1 голос
/ 15 апреля 2009

«assert (...)» должен помочь вам находить ошибки в вашей программе на C ++, проверяя определенные условия во время выполнения. Вероятно, что-то не настроено прямо в вашей программе, что вызывает этот сбой. Как сказал Пакс, посмотрите, можете ли вы открыть winocc.cpp и посмотреть строку 345, чтобы увидеть, что проверяет «assert», и посмотреть, сможете ли вы выяснить, почему он не работает.

Обычно, когда вы производите сборку, вы «компилируете» все утверждения, чтобы они не вызывали сбой вашего приложения.

0 голосов
/ 15 апреля 2009

Если это не dll, которым вы управляете (иногда поставщик оставляет assert в библиотеке отладки), вы можете показать дизассемблирование и изменить расположение памяти assert (где оно ломается) с 3 на 90. Это изменится ваш __asm ​​int 3 для __noop. Хорошо для очистки прерывания, от которого вы можете избавиться - по крайней мере, для этого сеанса отладки. :)

0 голосов
/ 15 апреля 2009

Утверждения используются для проверки предварительных условий / постусловий и промежуточных результатов в коде во время выполнения.

Скорее всего, вы вызвали функцию / метод без соблюдения всех предварительных условий, и это было обнаружено во время выполнения.

В VC утверждения вводятся в двоичные файлы для цели Debug, а не для цели Release.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...