Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.05.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
Тимоха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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.004 c
2-1295938268
Василий21
2011-01-25 09:51
2011.05.08
Таймер чужой программы и HOOK


15-1295818185
Юрий
2011-01-24 00:29
2011.05.08
С днем рождения ! 24 января 2011 понедельник


15-1296083374
Германн
2011-01-27 02:09
2011.05.08
TListView с группами


15-1293694941
Kerk
2010-12-30 10:42
2011.05.08
С новым годом!


3-1257918283
Alshtam
2009-11-11 08:44
2011.05.08
Сравнение баз данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский