Проблемы с запуском нескольких копий MFC приложения
Я решил на своём компе попробовать, запустилось всего 8 копий программы, девятая не открывается. Только появляется окно, сразу закрывается.
Ну я открыл проект в MSVC (c++, mfc), загружаю в дебаггере, действительно, получаю эксепшен при запуске такого плана:
...............................
'program.exe': Loaded 'D:\WINDOWS\system32\hnetcfg.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\wshtcpip.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched32.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched20.dll', No symbols loaded.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
First-chance exception at 0x7c812aeb in program.exe: Microsoft C++ exception: CInvalidArgException at memory location 0x0012df4c..
Warning: Uncaught exception in WindowProc (returning 0).
'program.exe': Loaded 'D:\WINDOWS\system32\nvwimg.dll', Binary was not built with debug information.
'program.exe': Unloaded 'D:\WINDOWS\system32\nvwimg.dll'
'program.exe': Loaded 'D:\WINDOWS\system32\nvwddi.dll', No symbols loaded.
First-chance exception at 0x00401310 in program.exe: 0xC0000005: Access violation reading location 0xcccccdcc.
Unhandled exception at 0x00401310 in program.exe: 0xC0000005: Access violation reading location 0xcccccdcc.
Вставляю AfxEnableControlContainer(0); в Init класса основного диалога, получаю самый натуральный виндовый эксепшен:
.......................................
'program.exe': Loaded 'D:\Program Files\Kaspersky Lab\Kaspersky Anti-Virus 7.0\dnsq.dll', No symbols loaded.
The thread 'Win32 Thread' (0x628) has exited with code 0 (0x0).
'program.exe': Loaded 'D:\WINDOWS\system32\winrnr.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\rasadhlp.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\hnetcfg.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\wshtcpip.dll', No symbols loaded.
Warning: Dialog creation failed! GetLastError returns 0x00000008
'program.exe': Loaded 'D:\WINDOWS\system32\riched32.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched20.dll', No symbols loaded.
'program.exe': Unloaded 'D:\WINDOWS\system32\riched32.dll'
'program.exe': Unloaded 'D:\WINDOWS\system32\riched20.dll'
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
'program.exe': Loaded 'D:\WINDOWS\system32\riched32.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched20.dll', No symbols loaded.
'program.exe': Unloaded 'D:\WINDOWS\system32\riched32.dll'
'program.exe': Unloaded 'D:\WINDOWS\system32\riched20.dll'
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
First-chance exception at 0x7c812aeb in program.exe: Microsoft C++ exception: CInvalidArgException at memory location 0x0012df4c..
Warning: Uncaught exception in WindowProc (returning 0).
First-chance exception at 0x00401310 in program.exe: 0xC0000005: Access violation reading location 0xcccccdcc.
Unhandled exception at 0x00401310 in program.exe: 0xC0000005: Access violation reading location 0xcccccdcc.
The program '[3768] program.exe: Native' has exited with code 0 (0x0).
Причём не понятно, в каком месте кода возникает эксепшен. Вроде бы при создании таба в одном из диалоговых окон.
Самая странная вещь заключается в том, что если также запускать программу при уже запущенных семи копиях, она запустится без каких-либо проблем... На других компах максимальное количество копий сильно варьируется..
Кто-нибудь сталкивался с такой проблемой? Ума не приложу, в чём дело.
У меня их два в разных диалогах. Оба инициализируются через AfxInitRichEdit(). Я что-то упустил? Что-то ещё надо добавлять?
У меня их два в разных диалогах. Оба инициализируются через AfxInitRichEdit(). Я что-то упустил? Что-то ещё надо добавлять?
И все-таки, как вы поняли, что проблема в RichEdit?
ну ошибка, которую показывает деббагер, указывает на наличие "OLE Controls". У меня вроде только ричэдит подходит под это описание)
Если да - тогда включайте Debug->Exceptions, Break on throw. И смотрите стек вызовов.
Если да - тогда включайте Debug->Exceptions, Break on throw. И смотрите стек вызовов.
воспроизводятся, но странные и периодически разные.
Попробовал как вы сказали (в Debug->Exceptions отметил галочками всё, что можно), получил такой output:
'program.exe': Loaded 'D:\WINDOWS\system32\winrnr.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\rasadhlp.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\hnetcfg.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\wshtcpip.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched32.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched20.dll', No symbols loaded.
program.exe has triggered a breakpoint
Останов произошёл вот тут:
TabItem.mask = TCIF_PARAM;
TabItem.lParam = (LPARAM)pAPage3;
m_TabCtrl.SetItem(5, &TabItem);
VERIFY(pAPage3->Create(CAPage3::IDD, &m_TabCtrl)); <-------------- тут первый останов
pAPage3->SetWindowPos(NULL, 2, 42, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
pAPage3->ShowWindow(SW_HIDE); <--- тут происходит следующий бряк, если продолжить выполнение), причём hWnd pAPage3 равно нулю - 0x00000000)
А если ещё дальше продолжить, то получаем вообще невминяемые эксепшены:
program.exe has triggered a breakpoint
Error: no data exchange control with ID 0x03EC.
First-chance exception at 0x7c812aeb in program.exe: Microsoft C++ exception: CNotSupportedException at memory location 0x0012dcd8..
First-chance exception at 0x7c812aeb in program.exe: Microsoft C++ exception: CInvalidArgException at memory location 0x0012dbe8..
Диалог pAPage3 загружается в таб главного окна. Содержит стандартные кнопочки, галки, переключатели, ну и combobox. Возможно, первоначально проблемы происходят где-то в предыдущих диалогах.
А теперь самое интересное! Как я писал в самом начале, у меня загружается только 5 копий программы. Сейчас я попробовал, то же самое, но при загрузке 6-го он повисает и перестают открываться вообще какие-либо приложения!!! У меня 4-ёх ядерный процессор, 6-ая копия программы занимает 25%. Остальные 75% свободны и при этом даже при попытке открыть диспетчер задач (через alt+ctrl+del) я получаю звук ошибки и он тупо не открывается, пока я не убью одну из пяти запущенных копий программы!!
Далее, у меня было открыто 4 копии QIP с кучей диалогов, я поубивал их и смог запустить 11 копий своей программы :/ Как это так? Может количество загруженных элементов управления в виндах ограничено? Как это проверить? Как в этом убедиться?
нулю :/
но дело в том, что в зависимости от количества открытых программ в виндах открываемая программа падает в совершенно разных местах. И бывает, в output логе просматривается с десяток надписей типа:
Cant create dialog. GetLastError() return 0x00000008
Это не цитата, но смысл таков (при этом оперативы программа ест 40мб судя по диспетчеру задач). Итак, моя версия:
У меня программа имеет несколько окон с кучей настроек. Программа написана так, что все окна с настройками всегда открыты (то есть они создаются через Create(), а затем я их уже показываю/прячу через ShowWindow(SW_SHOW/SW_HIDE). Соответственно, когда программа загружена, загружены и 100 галочек/кнопочек, которые расположены в настроках.
Ну и видать в виндах всё-таки есть какой-то ограничитель.. Ведь если запущено предельное число моих программ (это где-то 10), то я не могу запустить вообще ничего. Даже калькулятор или блокнот.
Отсюда вопросы:
1. есть ли всё-таки такой ограничитель на кол-во элементов управления?
2. в данный момент, как я описал выше, я просто прячу ненужные окна. А как мне сделать, чтобы они полностью закрывались и открывались, при этом чтобы не блокировали работу основного окна? Надеюсь, понятно о чём я.
Посмотреть утечку хендлов можно через Task Manager. В окне View->Select Columns нужно выбрать USER Objects, Handle Count, GDI Objects. И посмотреть, не ползет ли какое число слишком сильно вверх.
А за постоянно открытые окошки я бы отрывал ручки :mad:. Потому что в итоге получается "ни себе, ни людям". И хорошо, если пользователь поймет, какая из программ пошла в разнос. А то, бывает, обращается за техподдержкой и приходится искать в своей программе несуществующую ошибку...
Окошки надо закрывать (только не функцией CloseWindow!). Есть функция DestroyWindow.
Можно также открывать их как диалоги. Тогда часть задач по созданию и удалению контролов возьмет на себя ОС.
Посмотреть утечку хендлов можно через Task Manager. В окне View->Select Columns нужно выбрать USER Objects, Handle Count, GDI Objects. И посмотреть, не ползет ли какое число слишком сильно вверх.
А за постоянно открытые окошки я бы отрывал ручки :mad:. Потому что в итоге получается "ни себе, ни людям". И хорошо, если пользователь поймет, какая из программ пошла в разнос. А то, бывает, обращается за техподдержкой и приходится искать в своей программе несуществующую ошибку...
Окошки надо закрывать (только не функцией CloseWindow!). Есть функция DestroyWindow.
Можно также открывать их как диалоги. Тогда часть задач по созданию и удалению контролов возьмет на себя ОС.
скриншот прикрепил. Процессы с закрытым названием - моя программа. Видно, что User objects имеет больше всех остальных процессов. То есть, действительно проблема в этом? Но ведь значения на вид не так критичны..
Получается, что чтобы побороть проблему, надо уничтожать окна и при требовании пользователя их заново инициализировать?
...Ну и видать в виндах всё-таки есть какой-то ограничитель.. Ведь если запущено предельное число моих программ (это где-то 10), то я не могу запустить вообще ничего. Даже калькулятор или блокнот....
... есть ли всё-таки такой ограничитель на кол-во элементов управления?
Да, есть.
Возможно Вам поможет это