![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов функции главной программы из dll. [D6, Win2k]
bloodman © (2004-08-04 21:12:00)Есть программа , использующая 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 .
В чем может быть ошибка?
GuAV (2004-08-05 02:05:00) [1]> function CallBack(Create : TCreate ; Func:TCbFuncs):boolean of object;
то есть...
TCalBackFunc = function (Create : TCreate ; Func:TCbFuncs):boolean of object; - вот куда это слово.
GuAV (2004-08-05 02:04:00) [2]да, не это а другое
> function CallBack(Create : TCreate ; Func:TCbFuncs):boolean of object;
имхо у тебя тут сильно напутано...
bloodman (2004-08-05 01:44:00) [3]что ты имеешь в виду
TInit=procedure(App: Integer;PCallBack: TCallBackFunc) of object; ??
помоему это не то...
GuAV (2004-08-05 01:00:00) [4]
> function TPlugin.CallBack(Create : TCreate ; Func:TCbFuncs):boolean;
> TInit=function(App: Integer;PCallBack: TCallBackFunc): Boolean;stdcall;
of object- F1...
bloodman (2004-08-05 00:32:00) [5]ок
типы:
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;
Гаврила (2004-08-05 00:16:00) [6]не важно, какое, важно, чтобы в хосте и в библиотеке было одинаково.
Наверно, придется тебе привести больше кода тут, так, на первый взгляд, не понятно в чем дело.
Второй параметр в callback тоже вызывает большие сомнения
bloodman (2004-08-04 23:46:00) [7]пробовал ставить stdcall , cdecl , register . Не помогает...
Гаврила (2004-08-04 23:45:00) [8]проверь соглашения о вызовах
bloodman (2004-08-04 23:30:00) [9]Не работает :(
Гаврила (2004-08-04 23:20:00) [10]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:17:00) [11]Вот так? (в 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:07:00) [12]пардон, передавать в Init с собакой
Гаврила (2004-08-04 23:05:00) [13]попробуй убрать тип PCallBackFunc, соответственно передавать без "собак", и дополнительная локальная переменная внутри DLL - процедуры не нужна.
Еще момент, если не передаются параметры, не переврал ли ты с соглашениями о вызовах ?
bloodman (2004-08-04 22:03:00) [14]Или как по другому можно вызвать процедуру???
bloodman (2004-08-04 21:48:00) [15]по большому счету это не важно, т.к. первый параметр тоже не передается.
зачем ты передаешь указатель на указатель на функцию
Где??
Гаврила (2004-08-04 21:37:00) [16]Намудрил ты что-то сильно
вот что такое Func:TCbFuncs ??
и зачем ты передаешь указатель на указатель на функцию ?