Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.08;
Скачать: CL | DM;

Вниз

импорт функции в длл   Найти похожие ветки 

 
Тимоха111   (2011-02-02 02:10) [0]

В инете полно статей где описываются методы позволяющие использовать функции находящиеся в длл, но нигде не нашел обратный вызов, т.е. функция есть в программе, а надо вызвать ее в длл, это возможно?


 
Тимоха111   (2011-02-02 02:19) [1]

длл загружается динамически


 
Servy ©   (2011-02-02 02:23) [2]

Предполагаю, что вам нужно то, что обычно называется callback. Пример:

type
 // TPrintProc должен быть описан одинаково как в dll, так и в основной
 // программе. Стоит подумать над тем, чтобы выделить ее в отдельный модуль,
 // который будет использоваться обоими проектами
 TPrintProc = procedure (Message: string);


В dll:

procedure SomeDllProc(Print: TPrintProc);
begin
 Print("Hello from dll"); // вызываем функцию основной программы из dll
end;


В exe:

procedure MyPrint(Message: string);
begin
 Writeln(Message);
end;

begin
 SomeDllProc(MyPrint);  
end.


 
Германн ©   (2011-02-02 02:36) [3]


>  импорт функции в длл
>
> Тимоха111   (02.02.11 02:10)
>
> В инете полно статей где описываются методы позволяющие
> использовать функции находящиеся в длл, но нигде не нашел
> обратный вызов, т.е. функция есть в программе, а надо вызвать
> ее в длл, это возможно?
>

Нет, не возможно.


 
Тимоха111   (2011-02-02 02:37) [4]

Спасибо, функция, которую надо вызвать в основной программе, никакие данные не передает в длл, она выполняется в программе, просто нужно заставить длл выполнить ее :)


 
Servy ©   (2011-02-02 03:30) [5]


> Спасибо, функция, которую надо вызвать в основной программе,
>  никакие данные не передает в длл, она выполняется в программе,
>  просто нужно заставить длл выполнить ее :)


Вы хотите странного. Изложите конкретную задачу, а не бессмысленное желание укусить себя за ухо.


> Нет, не возможно.

Ну почему же? Бывают люди со вставными челюстями, вполне способные укусить себя за ухо... Другое дело, что обычно даже они этим не занимаются, но в целом им ничто не мешает это сделать:

Exe:
unit Main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TMainForm = class(TForm)
   Memo: TMemo;
   bClickMe: TButton;
   procedure bClickMeClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 MainForm: TMainForm;

implementation

{$R *.dfm}

procedure test;
begin
 MainForm.Memo.Lines.Add("test procedure called");
end;

exports
 test;

procedure TMainForm.bClickMeClick(Sender: TObject);
var
 H: THandle;
begin
 H := LoadLibrary("DllProject.dll");
 if H <> 0 then
   FreeLibrary(H);
end;

end.


Dll:
library DllProject;

uses
 Windows,
 SysUtils,
 Classes;

{$R *.res}

procedure test; external "ExeProject.exe";

begin
 test;
end.


 
Тимоха111   (2011-02-02 03:42) [6]

Servy, огромное спасибо, вы мне очень помогли!


 
Servy ©   (2011-02-02 03:55) [7]


> Servy, огромное спасибо, вы мне очень помогли!

Очередной сумасшедший ученый ушел мастерить своего Франкенштейна, а я получается к этому руку приложил =_=. Правильно говорят, молчание - золото.


 
Anatoly Podgoretsky ©   (2011-02-02 10:52) [8]

> Servy  (02.02.2011 03:30:05)  [5]

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


 
Тимоха111   (2011-02-02 12:40) [9]

Используется одним exe шником.


 
sniknik ©   (2011-02-02 12:43) [10]

> Используется одним exe шником.
тогда смысла в dll = ноль. если только не в учебных целях или другая "экзотика".


 
Тимоха111   (2011-02-02 13:04) [11]

другая экзотика, если есть функция в основной программе, при выполнении которой вызываются другие функции из той же программы, то зачем в длл пихать все эти фунции, если можно просто вызвать на выполнение функцию находящеюся в основной программе, дллкой


 
Anatoly Podgoretsky ©   (2011-02-02 13:23) [12]

> Тимоха111  (02.02.2011 13:04:11)  [11]

Ты не понял, ДЛЛ (скрипач) не нужен.


 
Игорь Шевченко ©   (2011-02-02 15:04) [13]


> то зачем в длл пихать все эти фунции, если можно просто
> вызвать на выполнение функцию находящеюся в основной программе,
>  дллкой


Функцию надо убрать из основной программы и перенести в другую DLL, которая будет вызываться первой DLL


 
Студент   (2011-02-03 13:47) [14]

Можно ещё передавать в dll (InitDll) указатель на функцию...


> Тимоха111   (02.02.11 13:04) [11]


Вы сами-то поняли что сказали? Зачем тогда вообще Dll? Самой программой и запускайте функцию...


> бессмысленное желание укусить себя за ухо


Хорошее сравнение... :)
"Я хочу укусить себя за ухо. Не получается. Что делать? Это вообще реализуемо стандартными методами (без хаков)?"



Страницы: 1 вся ветка

Текущий архив: 2011.05.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
15-1296073510
светик
2011-01-26 23:25
2011.05.08
курсовая по ооп


15-1295420292
12
2011-01-19 09:58
2011.05.08
Ищу. Софтину. Простой и надежный удаленный доступ.


15-1295946347
Дмитрий С
2011-01-25 12:05
2011.05.08
Каким образом ограничивается скорость скачки на стороне клиента?


15-1295515030
Knight
2011-01-20 12:17
2011.05.08
RAID1


15-1296111273
Jeer
2011-01-27 09:54
2011.05.08
Проблема парсинга TSQLQuery (dbExpress)..