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

Вниз

Можно ли делать чтото вроде етого:   Найти похожие ветки 

 
drin ©   (2003-01-07 19:09) [0]

По крайней мере у меня не получается


uses
Windows, SysUtils;

Type
PProc = ^TProc;
TProc = function(param1, param2: integer): integer; StdCall;

TType = class

public
constructor Create;
function FProc(param1, param2: integer): integer; StdCall;
end;

Var
VType: TType;
Proc: PProc;
Res: integer;


function TType.FProc(param1, param2: integer): integer; StdCall;
begin
MessageBox(0, PChar(inttostr(param1)), PChar(inttostr(param2)), MB_OK);
result:=3;
end;

constructor TType.Create;
begin
Proc:=@TType.FProc;
end;

begin
VType:=TType.Create;
if Proc <> nil then
Res:=TProc(Proc)(1, 2);
MessageBox(0, PChar(inttostr(Res)), PChar(inttostr(Res)), MB_OK);
end.


В ф-ии TType.FProc param1 окзывается правильным, а вот param2 нет, результат ф-ии тоже правилен но при выводе его возникает Exception. Я знаю что зделано абсолютно некорректно, потому и спрашиваю.


 
TTCustomDelphiMaster ©   (2003-01-07 19:32) [1]

А что собственно вы хотели сделать.


 
Rouse_ ©   (2003-01-07 19:54) [2]

Я многое конечно видел, но такое :))
Действительно зачем делать класс и после этого в его конструкторе писать
Proc:=@TType.FProc;
Proc то глобальна. Странно все это.

Для чего спрашивается извращаться если можно заместо
Res:=TProc(Proc)(1, 2);
Сделать
Res := VType.FProc(1,2);

Ну короче, эксперимент в принципе прикольный, спасибо, посмеялся :))

Желаю успехов

ЗЫ: не принимайте это близко к сердцу :))


 
drin ©   (2003-01-07 20:09) [3]

Ну например есть у нас Dll"ка, в ней процедура аргумент которой указатель на функцию типа ТProc,её нужно связывать с каждым объектом данного класса:

uses
Windows, SysUtils;

Type
PProc = ^TProc;
TProc = function(param1, param2: integer): integer; StdCall;

TType = class

public
constructor Create;
function FProc(param1, param2: integer): integer; StdCall;
end;

Var
VType: TType;

procedure DllProc(AProc: PProc);
external "MyLib.dll";


function TType.FProc(param1, param2: integer): integer; StdCall;
begin
MessageBox(0, PChar(inttostr(param1)), PChar(inttostr(param2)), MB_OK);
result:=3;
end;

constructor TType.Create;
begin
DllProc(@TType.FProc);
end;

begin
VType:=TType.Create;
end.


 
TTCustomDelphiMaster ©   (2003-01-07 20:48) [4]

Во первых передача метода класса TType.FProc ничего не даст. Вы не сможете его правильно вызвать, т.к. вызов метода класса и обычной процеруры реализованы по разному(При вызове метода неявно передается указатель на объект, которому пренадлежит метод). Из за этого и возникает ошибка.
Во вторых если вам нужно работать с объектом в Dll то почему бы его там и не создать.
И в третих если вы все таки хотите работать с объектом из Dll то передавайте указатель на него. Но и в этом случае не все просто. Пример можно посмотреть на королевстве Дельфи в разделе Hello World.
Ну и в четвертых кроме Dll есть Bpl.

Желаю успехов


 
icWasya ©   (2003-01-08 09:21) [5]

может быть надо
Type
PProc = ^TProc;
TProc = function(param1, param2: integer): integer of object; StdCall;



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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
1-49082
kolega
2003-01-04 22:49
2003.01.16
как исправить иероглифы?


1-49032
Геннадий
2003-01-07 22:26
2003.01.16
Обработка OnMouseMove для TRadioGroup - КАК ?


14-49300
han_malign
2002-12-28 11:15
2003.01.16
---|Ветка была без названия|---


3-48913
_Vovan_
2002-12-18 17:00
2003.01.16
Почему?


4-49360
ed30
2002-11-29 13:30
2003.01.16
Освобождение памяти после работы внешней программы