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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
#1

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

10.04.2011, 20:03. Просмотров 1042. Ответов 4
Метки нет (Все метки)

Ситуация такая:
Из СОМ-объекта (в виде 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 тоже потянет)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2011, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание дочерних окон в DLL (C++):

Активность окна и дочерних ему окон - C++
Приветствую. Такая проблема. Есть окно &quot;А&quot;. В нём дочернее окно &quot;Б&quot;. Размеры окна &quot;Б&quot; равны размерам окна &quot;А&quot;. И координаты окна...

[DLL] отслеживание и смена названий окон - C++
Пожалуйста подскажите как можно создать некую DLL, которая будет загружаться с определенной программой в память и &quot;останется&quot; там до...

Создание окон - C++
Пожалуйста подскажите, как создавать и работать с окнами.

WIN32, Windows(Окна) . Создание Доп.окон. - C++
Снова я) Есть програмка. Программная среда -VisualStudio - проект Win32 . Есть основное окно. Нужно создать ещё одно. Как я понял ,...

Объединить два функционала - создание окон и рисование в них - C++
Доброго времени суток. Помогите пожалуйста или хотя бы подскажите как соединить два кода в один. Задача состоит в том, чтобы программа...

Создание dll - C++
Всем привет, лютые и бородатые прогеры :) Потихоньку изучаю язык С. Столкнулся с такой проблемой. Не могу сделать динамическую...

4
tsttom
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 174
14.04.2011, 17:25 #2
http://www.picosearch.com/cgi-bin/ts.pl
0
tsttom
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 174
14.04.2011, 17:26 #3
http://www.picosearch.com/cgi-bin/ts.pl
0
tsttom
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 174
14.04.2011, 17:29 #4
http://bcbjournal.org/articles/vol2/9809/MDI_child_forms_in_a_DLL.htm
0
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
17.04.2011, 12:04  [ТС] #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)?
0
17.04.2011, 12:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2011, 12:04
Привет! Вот еще темы с ответами:

Создание DLL - C++
Всем доброго время суток помогите мне разобраться в том как создавать .dll или подскажите литературу Например как написать вот эту...

создание DLL - C++
Помогите пожалуйста понять что не так сделала 8)))) может что-то странное в коде Program1.dll ...

Создание .dll - C++
Здравствуйте.Нужна помощь в создание dll.Опишите пожалуйста саму структуру dll-файла. Компилятор-g++ 4.8.1,среда-notepad++.

Создание DLL - C++
const __int64 MathArray = {{0, 1}, {2, 3}, {4, 5}}; Ошибок нет. но в .h ругается!!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru