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

Вниз

Вызов функции главной программы из dll.   Найти похожие ветки 

 
bloodman ©   (2004-08-04 21:12) [0]

Есть программа , использующая dll. Есть в этой программе функция:
...
TCreate = set of (ListBox,Memo,Image,StaticText,TreeView,Edit);
PCallBackFunc = ^TCalBackFunc;
TCalBackFunc = function (Create : TCreate ; Func:TCbFuncs):boolean;
...
function CallBack(Create : TCreate ; Func:TCbFuncs):boolean;
...
Сначала вызываю функцию в dll
function init (Func : PCallBackFunc);
вот так :
init (@CallBack);

в DLL пишу так:

function init (Func : PCallBackFunc);
var
 MyCall : TCalBackFunc;
 cr: TCreate;
begin
@MyCall:=Func;
cr:=[ListBox]
MyCall(cr, ...);
end;

Функция главной программы вызывается, НО параметры почему то не передаются. Т.е в них содержатся другие значения а не те которые присваиваются в init .
В чем может быть ошибка?


 
Гаврила ©   (2004-08-04 21:37) [1]

Намудрил ты что-то сильно

вот что такое Func:TCbFuncs ??
и зачем ты передаешь указатель на указатель на функцию ?


 
bloodman ©   (2004-08-04 21:48) [2]

по большому счету это не важно, т.к. первый параметр тоже не передается.

зачем ты передаешь указатель на указатель на функцию
Где??


 
bloodman ©   (2004-08-04 22:03) [3]

Или как по другому можно вызвать процедуру???


 
Гаврила ©   (2004-08-04 23:05) [4]

попробуй убрать тип PCallBackFunc, соответственно передавать без "собак", и дополнительная локальная переменная внутри DLL - процедуры не нужна.

Еще момент, если не передаются параметры, не переврал ли ты с соглашениями о вызовах ?


 
Гаврила ©   (2004-08-04 23:07) [5]

пардон, передавать в Init с собакой


 
bloodman ©   (2004-08-04 23:17) [6]

Вот так? (в dll)
function Init(PCallBack: Pointer): Boolean;stdcall;
var
cr : TCreate;
fb : TCbFuncs;
begin
@MyCall:=PCallBack;
cr:=[ListBox,StaticText];
fb.ListBox.Top:=20;
fb.ListBox.Left:=40;
MyCall(cr,fb);
result:=true;
end;

в проге

init (@CallBack);

так не работает.


 
Гаврила ©   (2004-08-04 23:20) [7]

TCreate = set of (ListBox,Memo,Image,StaticText,TreeView,Edit);
TCalBackFunc = function (Create : TCreate ; Func:TCbFuncs):boolean;
...
function CallBack(Create : TCreate ; Func:TCbFuncs):boolean;
...
function init (Func : TCallBackFunc);
вот так :
init (@CallBack);

в DLL пишу так:

function init (Func : TCallBackFunc);
var
// MyCall : TCalBackFunc;
cr: TCreate;
begin
//@MyCall:=Func;
cr:=[ListBox]
//MyCall(cr, ...);
Func(cr, ...);
end;


 
bloodman ©   (2004-08-04 23:30) [8]

Не работает :(


 
Гаврила ©   (2004-08-04 23:45) [9]

проверь соглашения о вызовах


 
bloodman ©   (2004-08-04 23:46) [10]

пробовал ставить stdcall , cdecl , register . Не помогает...


 
Гаврила ©   (2004-08-05 00:16) [11]

не важно, какое, важно, чтобы в хосте и в библиотеке было одинаково.

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

Второй параметр в callback тоже вызывает большие сомнения


 
bloodman ©   (2004-08-05 00:32) [12]

ок

типы:

TCreate = set of (ListBox,Memo,Image,StaticText,TreeView,Edit);

 PMainFunc = ^TMainFunc;
 TMainFunc = function:boolean;stdcall;

 TListBoxProcs = record
    Top       : integer;
    Left      : integer;
    OnChange  : PMainFunc;
    OnClick   : PMainFunc;
    OnEnter   : PMainFunc;
    OnExit    : PMainFunc;
    PopupMenu : PPopupMenu
 end;

.......

 TCbFuncs = record
    ListBox    : TListBoxProcs;
    Edit       : TEditProcs;
    Image      : TImageProcs;
    StaticText : TStaticTextProcs;
    Memo       : TMemoProcs;
    TreeView   : TTreeViewProcs;
  end;

  PCAllBackFunc = ^TCallBackFunc;
  TCallBackFunc = function(Create : TCreate ;Func:TCbFuncs):boolean;

Это dll:
function InitLib(App: Integer;PCallBack: TCallBackFunc): Boolean;stdcall;
var
cr : TCreate;
fb : TCbFuncs;
begin
DLLApp      :=Application;
Application :=TApplication(App);
// Application.CreateForm(TfmDLL, fmDLL);
// @MyCall:=PCallBack;
cr:=[ListBox,StaticText];
fb.ListBox.Top:=20;
fb.ListBox.Left:=40;
fb.ListBox.OnClick:=@but1;
PCallBack(cr,fb);
result:=true;
end;

п рограмме

класс TPlugin.

TInit=function(App: Integer;PCallBack: TCallBackFunc): Boolean;stdcall;

function TPlugin.CallBack(Create : TCreate ; Func:TCbFuncs):boolean;
begin
//ListBox,Memo,Image,StaticText,TreeView,Edit);
(* SetLength(Listboxes,0);
SetLength(Edits,0);
SetLength(Memos,0);
SetLength(Images,0);
SetLength(StaticTexts,0);*)

IF ListBox in Create then
begin
 SetLength(ListBoxes,Length(ListBoxes)+1);
 Listboxes[Length(ListBoxes)]:=TListBox.Create(nil);
 Listboxes[Length(ListBoxes)].Parent:=FPanel;
 Listboxes[Length(ListBoxes)].Top:=Func.Listbox.Top;
 Listboxes[Length(ListBoxes)].Left:=Func.ListBox.Left;
 @Listboxes[Length(ListBoxes)].OnClick:=Func.ListBox.OnClick;
end;
end;

function TPlugin.init(App: Integer): Boolean;
var
 la : TCAllBackFunc;
begin
IF FReturnCallBack then la:=@Tplugin.Callback else la:=nil;
IF ((@FInit <> nil ) and FInit(App,la)) then
begin
  FLoaded:=true;
  result:=true;
end
 else result:=false;

end;


 
GuAV ©   (2004-08-05 01:00) [13]


> function TPlugin.CallBack(Create : TCreate ; Func:TCbFuncs):boolean;


> TInit=function(App: Integer;PCallBack: TCallBackFunc): Boolean;stdcall;

of object - F1...


 
bloodman ©   (2004-08-05 01:44) [14]

что ты имеешь в виду

TInit=procedure(App: Integer;PCallBack: TCallBackFunc) of object; ??

помоему это не то...


 
GuAV ©   (2004-08-05 02:04) [15]

да, не это а другое

> function CallBack(Create : TCreate ; Func:TCbFuncs):boolean of object;

имхо у тебя тут сильно напутано...


 
GuAV ©   (2004-08-05 02:05) [16]

> function CallBack(Create : TCreate ; Func:TCbFuncs):boolean of object;
то есть...
TCalBackFunc = function (Create : TCreate ; Func:TCbFuncs):boolean of object; - вот куда это слово.



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

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

Наверх




Память: 0.51 MB
Время: 0.039 c
3-1090972330
AleKo
2004-07-28 03:52
2004.08.22
Проверка на вхождение в операторе WHERE IN


1-1091897459
Kostya-xp
2004-08-07 20:50
2004.08.22
Кто знает как загрузить анимированный курсор из “res” фай


14-1089984552
Esu
2004-07-16 17:29
2004.08.22
ХеХе, жители Украины я думаю поймут :)


1-1091787198
массив
2004-08-06 14:13
2004.08.22
массив


1-1092039757
race1
2004-08-09 12:22
2004.08.22
строка в листе