Форум программистов, компьютерный форум CyberForum.ru

Создание дочерних окон в DLL - C++

Восстановить пароль Регистрация
 
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
10.04.2011, 20:03     Создание дочерних окон в DLL #1
Ситуация такая:
Из СОМ-объекта (в виде DLL-ки) грузится (LoadLibrary) другая DLL-ка.
Потом из последней вызывается функция, например CreateView, которой передаётся HWND родителя.
Функция должна создать дочернее окно и окно(диалог) должно реагировать на все сообщения (WM_xxx) как обычно.
1) Пробовал сделать это на VC7:
Делаем СОМ-объект в виде DLL с помощью ATL. Здесь вроде проблем нет.
Делаем DLL-ку из которой будет вызываться функция CreateView. Делаем ресурс диалог и его класс (MFC).
Функция CreateView:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HRESULT CAAMDefaultApp::CreateView(HWND hwndOwner)
{
    pWndParent = new CWnd;
    if(pWndParent->Attach(hwndOwner)){
        dlg.DoModal();
        //или
        //dlg.Create(IDD_ARISTARCH, pWndParent);
        
    }
    return S_OK;
}
extern 'C' HRESULT inline __declspec(dllexport) CreateView(HWND hwndOwner){
    return theApp.CreateView(hwndOwner);
}
В результате при вызове DoModal или Create происходит Debug Assertion Failure! в функции AfxGetResourceHandle.
Т.е., на сколько я понимаю, не может найтись ресурс (диалог)...
2) Пробовал сделать это на BCB6:
СОМ-объект остаётся тот же (написан на VC7+ATL).
Делаем DLL-ку...
Делаем форму...
Функция CreateView:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
extern 'C' HRESULT _export CreateView(HWND hwndOwner){
    frm = new TForm2(0);
    if(frm){
        frm->ParentWindow = hwndOwner;
 
        frm->ControlStyle << (csCaptureMouse|csClickEvents|csReflector);    //пробовал
        frm->ControlStyle >> csNoStdEvents;
        frm->Edit1->ControlStyle << (csCaptureMouse|csClickEvents|csReflector); //и так
        frm->Edit1->ControlStyle >> csNoStdEvents;
                                            //и без
        frm->ControlState << (csLButtonDown|csFocusing);
        frm->Edit1->ControlState << (csLButtonDown|csFocusing);         //этого
 
        frm->Show();
    }
    return S_OK;
}
В результате всё вроде-бы работает... нажимаются кнопки (Button), ставятся галочки (CheckBox), но когда нажимаешь левую кнопку на поле ввода (Edit, ComboBox и т.п.) поле ввода фокус не получает. Если нажать правую кнопку, то всё работает нормально (поле получает фокус и можно вводить текст).
Пробовал задавать обработчик TEdit::OnMouseUp, он не вызывается. А TForm::OnMouseUp вызывается.

Как быть?
(желательно чтобы решение было на VC7, но и на BCB6 тоже потянет)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2011, 20:03     Создание дочерних окон в DLL
Посмотрите здесь:

C++ API - Получить список хендлов дочерних окон C++
C++ WIN32, Windows(Окна) . Создание Доп.окон.
Создание dll C++
создание DLL C++
Создание окон C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tsttom
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 175
14.04.2011, 17:25     Создание дочерних окон в DLL #2
http://www.picosearch.com/cgi-bin/ts.pl
tsttom
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 175
14.04.2011, 17:26     Создание дочерних окон в DLL #3
http://www.picosearch.com/cgi-bin/ts.pl
tsttom
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 175
14.04.2011, 17:29     Создание дочерних окон в DLL #4
http://bcbjournal.org/articles/vol2/9809/MDI_child_forms_in_a_DLL.htm
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
17.04.2011, 12:04  [ТС]     Создание дочерних окон в DLL #5
tsttom, на picosearch нет такой ссылки, а на bcbjournal не совсем то.

С VC7 проблему решил (нужно статически линковать библиотеку MFCxx.DLL).
Но теперь другая проблема:
В диалог нужно вставить элемент ActiveX.
Вставляем: правый щелчок->Insert ActiveX...
В функции CreateView после dlg.Create (или DoModal) ничего не происходит. Диалог не отображается вообще. И отладчиком ничего не видно (видно дизассемблирование). Причём ничего не виснет.

Пробовал сделать ATL-ый диалог, здесь всё нормально. Диалог отображается, ActiveX-элемент тоже. Но как теперь с этим ActiveX взаимодействовать. Если в MFC можно было Add Variable.. потом ставим галочку Control Variable и Wizard создаёт класс(ы) для этого ActiveX, то в случае ATL галочка Control Variable не активна.
Пробовал вызывать GetDlgControl диалога, но здесь я могу получить указатель только на стандартные интерфейсы (IUnknown, IDispatch).
Можно конечно работать через IDispatch, но это не удобно. Гараздо удобнее работать через, специфичные для данного ActiveX, но где взять объявление этих интерфейсов?

Если кто знает, можете написать последовательность действий (желательно для случая ATL)?
Yandex
Объявления
17.04.2011, 12:04     Создание дочерних окон в DLL
Ответ Создать тему
Опции темы

Текущее время: 15:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru