![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли ;делать чтото вроде етого:
drin © (2003-01-07 19:09:00)По крайней мере у меня не получается
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. Я знаю что зделано абсолютно некорректно, потому и спрашиваю.
icWasya (2003-01-08 09:21:00) [1]может быть надо
Type
PProc = ^TProc;
TProc = function(param1, param2: integer): integer of object; StdCall;
TTCustomDelphiMaster (2003-01-07 20:48:00) [2]Во первых передача метода класса TType.FProc ничего не даст. Вы не сможете его правильно вызвать, т.к. вызов метода класса и обычной процеруры реализованы по разному(При вызове метода неявно передается указатель на объект, которому пренадлежит метод). Из за этого и возникает ошибка.
Во вторых если вам нужно работать с объектом в Dll то почему бы его там и не создать.
И в третих если вы все таки хотите работать с объектом из Dll то передавайте указатель на него. Но и в этом случае не все просто. Пример можно посмотреть на королевстве Дельфи в разделе Hello World.
Ну и в четвертых кроме Dll есть Bpl.
Желаю успехов
drin (2003-01-07 20:09:00) [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.
Rouse_ (2003-01-07 19:54:00) [4]Я многое конечно видел, но такое :))
Действительно зачем делать класс и после этого в его конструкторе писать
Proc:=@TType.FProc;
Procто глобальна. Странно все это.
Для чего спрашивается извращаться если можно заместо
Res:=TProc(Proc)(1, 2);
Сделать
Res := VType.FProc(1,2);
Ну короче, эксперимент в принципе прикольный, спасибо, посмеялся :))
Желаю успехов
ЗЫ: не принимайте это близко к сердцу :))
TTCustomDelphiMaster (2003-01-07 19:32:00) [5]А что собственно вы хотели сделать.