Форум: "Начинающим";
Текущий архив: 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