C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
особенности работы с dll, окна и dll
Ramzay
Отправлено: 09.03.2007, 01:19


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Работая с dll я выяснил для себя, что это очень удобная штука с точки зрения повторного использования кода.

Однако, наряду с достоинствами я натолкнулся на недостатки, которые я победить не смог. Если кто сталкивался с подобными проблемами, буду признателен за подсказку.

Итак, особенность №1

Вызываем dll-функцию. Функция динамически создает модальную форму. Проблема заключается в том, что форму невозможно свернуть. При нажатии на иконку "Свернуть" в верхнем правом углу окна ничего не происходит. При этом окно нормально закрывается крестиком и нормально разворачивается на весь экран. Если из такой формы создать еще одну, то она будет нормально сворачиваться.

Особенность №2

Вызываем dll-функцию. Функция динамически создает модальную форму №1, которая в свою очередь создает еще одну модальную форму №2. Находясь в форме №2 нажимаем Alt-Tab и переключаемся в какое-либо другое приложение, а затем переключиться обратно. Мы видим на экране форму №2, под которой лежит приложение (в которое мы переключались), а форма №1 лежит под этим приложением. Хотя форма №1 должна лежать под формой №2.

Особенность №3

Запускаем некоторое приложение (например Word или что-то другое).
Вызываем dll-функцию. Функция динамически создает модальную форму №1, которая в свою очередь создает еще одну модальную форму №2. В процессе работы пользователя в форме №2 выдается сообщение. (например, функцией ShowMessage или это может быть сообщение об ошибке). После того как пользователь прочел сообщение и нажал ОК, пользователь видит не форму №2, а приложение.

Отредактировано Ramzay — 09.03.2007, 01:23
olegenty
Отправлено: 09.03.2007, 08:26


Ветеран

Группа: Модератор
Сообщений: 2412



Для начала, есть ощущение, что EXE и DLL ты собрал статически, а не динамически. Пересобери динамически (Build with runtime packages и Use dynamic RTL) и данные эффекты должны улетучиться. При статической сборке экземпляры глобальный объектов (Application, Screen, Printer, etc) — локальны для EXE и для DLL (свои для каждого модуля то есть). При динамической — все модули "пользуются" единственным экземпляров данных объектов, созданных в EXE.
Ramzay
Отправлено: 09.03.2007, 14:58


Дежурный стрелочник

Группа: Участник
Сообщений: 31



QUOTE (olegenty @ 09.03.2007, 08:26)
Для начала, есть ощущение, что EXE и DLL ты собрал статически, а не динамически. Пересобери динамически (Build with runtime packages и Use dynamic RTL) и данные эффекты должны улетучиться.

Установка птицы "Build with runtime packages", оказывает заметное положительное воздействие. Но при этом придется за своей dll-кой таскать кучу пакеджей, а я к этому пока психологически не готов.

Что делает "Use dynamic RTL" — не понятно.

А нет ли какой-нибудь функции или метода, который бы позволил сделать окно задачи текущим окном Windows и вынести ее на передний план всех окон Windows?
Tantos
Отправлено: 09.03.2007, 18:20


Станционный диспетчер

Группа: Участник
Сообщений: 108



QUOTE (Ramzay @ 09.03.2007, 21:58)
А нет ли какой-нибудь функции или метода, который бы позволил сделать окно задачи текущим окном Windows и вынести ее на передний план всех окон Windows?

1. SetForegroundWindow
2. Вдогонку

Вернуться в Вопросы программирования в C++Builder