|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.10.2007, 23:22 | #1 |
Пользователь
Регистрация: 13.10.2007
Сообщений: 11
|
DLL
Есть программа и динамическая DLL подключенная к ней.
Как из DLL передать значение в программу? |
14.10.2007, 23:47 | #2 |
Реанимируюсь...
Участник клуба
Регистрация: 19.07.2007
Сообщений: 1,445
|
dll
Код:
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе... P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows" |
15.10.2007, 08:23 | #3 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
LAFam, ДЛЛ то хоть твоя?
I'm learning to live...
|
15.10.2007, 17:54 | #4 |
Пользователь
Регистрация: 13.10.2007
Сообщений: 11
|
|
15.10.2007, 18:36 | #5 |
Форумчанин
Регистрация: 26.04.2007
Сообщений: 440
|
Значит у тебя есть свой dll. Его экспортируешь(используешь) в программе. Пишите: в разделе type,
после описания объекта TForm1 (главной формы) нужно написать следующую строку: function lala (X,Y:Integer):Integer;StdCall; //lala- имя вашей функции + по этой строке Delphi узнаёт, что где-то существует такая функция lala, у неё есть два параметра, и она должна вызываться стандартным вызовом. StdCall-Оно говорит о том, что для вызова процедуры нужно использовать стандартный тип вызова. Если не указать ключевое слово StdCall, то параметры будут передаваться способом, заложенным фирмой Borland. Этот способ работает быстрее, но он не совместим со стандартными правилами. Теперь нужно сказать компилятору, где же искать эту загадочную функцию. Для этого после слова implementation пиши: function lala; external 'your.dll' name 'lala'; Здесь написано, что есть такая функция lala. После точки с запятой стоит ключевое слово external, которое говорит о том, что функция внешняя, не принадлежит программе. После этого слова указывается имя динамической библиотеки, где нужно искать функцию. Далее идёт ключевое слово name, которое означает, что функцию надо искать по имени. После этого ключевого слова указывается точное имя функции в библиотеки. НО:когда программе нужно выполнить функцию lala, то она просматривает все функции динамической библиотеки и ищет функцию с указанным именем. Это очень неэффективно и перед первым вызовом будет ощущаться большая задержка. Чтобы хоть немного ускорить процесс вызова таких функций можно использовать индексы- то бишь вместо последней строки пишешь: function lala; external 'your.dll' index 10; При этом в длл должно быть написано: exports lala index 10; |
15.10.2007, 18:49 | #6 |
Владимир М.
Участник клуба
Регистрация: 30.10.2006
Сообщений: 1,289
|
респект, bill )
Берегите друг друга!
|
15.10.2007, 21:00 | #7 |
Пользователь
Регистрация: 13.10.2007
Сообщений: 11
|
Ух как фсе просто! А я себе уже козни с этим DLL устраиваю.
Я ток одно не понял. В каком именно месте в DLL должно быть указано exports lala index 10; в самой процедуре в описании или где ? |
15.10.2007, 21:03 | #8 |
Пользователь
Регистрация: 13.10.2007
Сообщений: 11
|
И еще вопрос относительно процедуры SendMessage как ее использовать для отправки из длл в программу?
|
16.10.2007, 05:19 | #9 |
Форумчанин
Регистрация: 15.10.2007
Сообщений: 147
|
Часть 1
Файл библиотеки "MyminiMathDLL.pas"
Код:
Файл программы "UsingDLL.dpr" //Функции F1 и F3 ссылаются на одну и ту же функцию в библиотеке, // но по-разному- по имени и по ординалу(индексы, номеру и т.п.) Код:
|
16.10.2007, 05:38 | #10 |
Форумчанин
Регистрация: 15.10.2007
Сообщений: 147
|
Часть2:"относительно процедуры SendMessage "
Библиотека:
Код:
Создай новое приложение (оконное). Положи на форму кнопку (TButton) . Подправь код так: //красный текст нужно добавить Код:
Код:
1. Программа найдёт хэндл (лучше не спрашивай что это - обижусь =)) ) главного окна. 2. Вызовет процедуру из библиотеки, передав ей хэндл своего окна. 3. Процедура пошлёт указанному окну сообщение WM_CLOSE (описаны сообщения в модуле Messages). 4. Программа, получив "изниоткуда" команду закрыться попробует вызвать событие формы OnCloseQuery 5. OnCloseQuery мы не описывали, поэтому не произойдёт ничего. Дальше программа пытается вызвать OnClose - но его тоже нет и программа завершает работу, тем самым выполнив посланную через SendMEssage из dll команду. |