Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизВызов функции главной программы из 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c