Самая первая ошибка связанна с тем, что элемент прописан в реестре, но фактически его нет в доступных каталогах. Узнать о том что элемента нет можно в момент создания. За основу примеров взят "Шаг 368 - Вид на основе Microsoft DataGrid OLEDB".
int CTestViewGridView::OnCreate(LPCREATESTRUCT lpCreateStruct) { ...... BOOL l=cmg.Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE, CRect(0, 0, 400, 200), this, IDC_DBGRID1); if (l!=TRUE) { AfxMessageBox("Error"); return 1; } ...... }
Здесь мы функций Create создаем элемент управления. Если элемент управления прописан в реестре но все равно нам не доступен то мы в момент вызова CREATE получим FALSE. Соответственно на данный случай нужно реагировать. Я вернул FALSE прекратив дальнейшее создание клиентской области.
Вторая ошибка может быть связанна с тем, что OCX вообще не прописан в реестре. Давайте посмотрим как можно отреагировать на это. Для регистрации и отмены регистрации я написал два BAT файла. Для отмены:
Regsvr32.exe /u C:\WINDOWS\SYSTEM\MSDATGRD.OCX
Для регистрации:
Regsvr32.exe C:\WINDOWS\SYSTEM\MSDATGRD.OCX
Подробнее читайте "Шаг 34 - Регистрация компонент RegSrv32". Так вот если отменить регистрацию то ошибка компонента будет совершенно такая же. Обрабатывается точно также. Соотвествено у нас есть возможность проиводить обработку компонентов в данном месте. Самый наверно разумный способ поместить и OCX файлы, RegSrv.bat в DLL файл читайте "N/A". А при ошибке извлекать их в текущий каталог и производить регистрацию. С этого момент Вас не будет заботить наличие этих файлов в Windows.