А кто-нибудь в DLL разбирается
Первый:
1) делаем LoadLibrary
2) берем указаели на нужные функции при помощи GetProcAddress
3) вызываем функции
Второй:
1) подключаем LIB-файл библиотеки к проекту
2) вызываем функции
в чем разница?
первый случай (с LoadLibrary) - динамическое подключение, второй - статическое. при статическом подключении можно использовать классы из dll а не только функции, но есть существенный недостаток - если изменяется код dll, то надо будет делать либу и пересобирать экзешник с новой либой - иначе из-за смещения адресов пойдут глюки...
при динамическом подключении можно юзать только функции, но зато получаем гибкость - код dll можно менять как угодно - главное чтобы имена функций оставались неизменными :)
это только то что видно, а на самом деле наверняка еще есть какие-то заморочки с использованием памяти...
разница, собственно говоря, в этом и заключается - в способе подключения DLL.
Что-ж, кое-что понятно.
Правда, при статическом подключении все-же можно менять код DLL. Можно добавлять новые, функции формы, ижменять старые функции. Глюки возникают только когда меняются параметры и возвращаемые значения функций, если программа на них уже ссылалась. У меня, по крайней мере, так происходит.
А вот на счет глюков с формами (о нем я уже говорил здесь на форуме):
При динамическом подключении DLL все нормально, а при статическом - каждая форма в программе, вдруг начинает создавать отдельную кнопку на панели задач, а главная форма иногда теряет способность сворачиваться. (при динамическом подкючении такое наблюдается, если строить проект без галок Use dynamic (собственно, если не dynamic тогда static и см. выше) и Build with runtime...)
Причем каждое окно видно в диспетчере, как отдельная задача (опять же при статическом подключении) и все это уже не зависит ни от каких галок в настройках.
Про это что-нибудь можешь сказать?
при статическом подключении при отсутствии
dll при отсутствии этой самой dll программа не запустится
а при динамическом запустится но выдаст ошибку при попытке подключния.
я использую динамическое подключение тогда когда мне надо создать программу поддерживающую плагины
Про отображение формы в панели задач, помоему это
лечится примерно так
смотрим на конструкторы
(AOwner) { }
__fastcall TForm(Classes::TComponent* AOwner, int Dummy) : Forms::TCustomForm
(AOwner, Dummy) { }
__fastcall TForm(HWND ParentWindow) : TCustomForm(ParentWindow) { }
т.е. надо либо передать дескриптор какого либо окна из вашей программы либо
ваш Ваш Application в качестве владельца.
(AOwner) { }
__fastcall TForm(Classes::TComponent* AOwner, int Dummy) : Forms::TCustomForm
(AOwner, Dummy) { }
__fastcall TForm(HWND ParentWindow) : TCustomForm(ParentWindow) { }
т.е. надо либо передать дескриптор какого либо окна из вашей программы либо
ваш Ваш Application в качестве владельца.
Спасибо за подсказку.
Правда передача Application ничего не меняет, а вот если вызывать конструктор которому передается HWND, то все как надо!
Я очень долго с этим парился
еще раз спасибо :-)