В отладочной версии часто включены утверждения и/или отладочные символы. Это может привести к различному расположению памяти. В случае неверного указателя переполнения массива или подобного доступа к памяти Вы получаете доступ в одном случае к критической плохой памяти (например, указатель функции) и в другом случае, возможно, просто некоторая некритическая память (например, просто строка документа повреждается)
Вы не обрабатываете входящее сообщение потока пользовательского интерфейса. Взгляните на в блоге Раймонда (также см. здесь ) для примера.
while (true) {
switch (MsgWaitForMultipleObjects(1, &h,
FALSE, INFINITE, QS_ALLINPUT)) {
case WAIT_OBJECT_0:
DoSomethingWith(h); // event has been signalled
break;
case WAIT_OBJECT_0+1:
// we have a message - peek and dispatch it
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
// TODO: must handle WM_QUIT; see Raymond's blog for details
TranslateMessage(&msg);
DispatchMessage(&msg);
}
break;
default:
return FALSE; // unexpected failure
}
}