Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2007, 23:22   #1
LAFam
Пользователь
 
Регистрация: 13.10.2007
Сообщений: 11
По умолчанию DLL

Есть программа и динамическая DLL подключенная к ней.
Как из DLL передать значение в программу?
LAFam вне форума Ответить с цитированием
Старый 14.10.2007, 23:47   #2
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
Лампочка dll

Код:
 ....... ......... ......... ........... ......... .............
function TestFunc(I: Integer): Integer; stdcall;
 ....... ......... ......... ........... ......... .............
implementation
 ....... ......... ......... ........... ......... .............
function TestFunc; external 'Test.dll';
 ....... ......... ......... ........... ......... .............
Ленивый - не вреден... ему лень даже делать себе приятное.(Леонид С. Сухоруков)
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 15.10.2007, 08:23   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

LAFam, ДЛЛ то хоть твоя?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.10.2007, 17:54   #4
LAFam
Пользователь
 
Регистрация: 13.10.2007
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
LAFam, ДЛЛ то хоть твоя?
DLL моя просто я ток начаинаю работат ьс DLL вот и интересно мне как все эт происходит.
Если честно я не понял выписку находящуюся выше. Если не сложно обьясните (как для нуба). Я так понял лучше всего работать через файл подкачки. Или не верно?
LAFam вне форума Ответить с цитированием
Старый 15.10.2007, 18:36   #5
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 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;
bill вне форума Ответить с цитированием
Старый 15.10.2007, 18:49   #6
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

респект, bill )
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 15.10.2007, 21:00   #7
LAFam
Пользователь
 
Регистрация: 13.10.2007
Сообщений: 11
По умолчанию

Ух как фсе просто! А я себе уже козни с этим DLL устраиваю.
Я ток одно не понял. В каком именно месте в DLL должно быть указано exports lala index 10;
в самой процедуре в описании или где ?
LAFam вне форума Ответить с цитированием
Старый 15.10.2007, 21:03   #8
LAFam
Пользователь
 
Регистрация: 13.10.2007
Сообщений: 11
По умолчанию

И еще вопрос относительно процедуры SendMessage как ее использовать для отправки из длл в программу?
LAFam вне форума Ответить с цитированием
Старый 16.10.2007, 05:19   #9
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию Часть 1

Файл библиотеки "MyminiMathDLL.pas"
Код:
 
library MyminiMathDLL;
Function func1(param1,param2:integer):integer;
 begin
  Result:=param1+param2;
 end;
Function func2(param1,param2:integer):integer;
 begin
  Result:=param1*param2;
 end;
exports func1 index 0 name 'add';
exports func2 index 1 name 'multiply';
begin
end.

Файл программы "UsingDLL.dpr"
//Функции F1 и F3 ссылаются на одну и ту же функцию в библиотеке,
// но по-разному- по имени и по ординалу(индексы, номеру и т.п.)
Код:
program UsingDLL;
{$APPTYPE CONSOLE}
uses
  SysUtils;
Function F1(x,y:integer):integer;external 'MyminiMathDLL.dll' name 'add';
Function F2(x,y:integer):integer;external 'MyminiMathDLL.dll' name 'multiply';
Function F3(x,y:integer):integer;external 'MyminiMathDLL.dll' index 0;
begin
end.
Maslan вне форума Ответить с цитированием
Старый 16.10.2007, 05:38   #10
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию Часть2:"относительно процедуры SendMessage "

Библиотека:
Код:
library MyminiMathDLL;
Uses Windows,Messages;//Эти модули нужны для поддержки пересылки сообщений
Procedure SendMyMsg(h:THandle);
 begin
  SendMessage(h,WM_CLOSE,0,0);
 end;
exports SendMyMsg index 0 name 'proc_name_1';
begin
end.
Исполльзование:
Создай новое приложение (оконное). Положи на форму кнопку (TButton) .
Подправь код так:
//красный текст нужно добавить
Код:
 
var
  Form1: TForm1;
 Procedure P1(Handle:THandle);external 'MyminiMathDLL.dll' name 'proc_name_1';
implementation
В обработчике кнопки пиши вот такое:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 P1(Application.Handle);
end;
Итак. Что произойдёт при нажатии на кнопку?
1. Программа найдёт хэндл (лучше не спрашивай что это - обижусь =)) ) главного окна.
2. Вызовет процедуру из библиотеки, передав ей хэндл своего окна.
3. Процедура пошлёт указанному окну сообщение WM_CLOSE (описаны сообщения в модуле Messages).
4. Программа, получив "изниоткуда" команду закрыться попробует вызвать событие формы OnCloseQuery
5. OnCloseQuery мы не описывали, поэтому не произойдёт ничего. Дальше программа пытается вызвать OnClose - но его тоже нет и программа завершает работу, тем самым выполнив посланную через SendMEssage из dll команду.
Maslan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц