Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
3-1090543893
sashapont
2004-07-23 04:51
2004.08.22
порядковый номер записей


1-1091978593
Mbox
2004-08-08 19:23
2004.08.22
TDirectoryOutLine


9-1084040639
Дикс
2004-05-08 22:23
2004.08.22
OnTop


6-1087902372
w666w
2004-06-22 15:06
2004.08.22
Как написать простейший socks прокси...


1-1091795561
Konoko
2004-08-06 16:32
2004.08.22
Как отцентрировать текст в ячейках StringGrid?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский