[DUG] call a method function from outside object
Ross Levis
ross at stationplaylist.com
Mon Jul 11 16:08:20 NZST 2005
I've spent a lot of time trying to work out a solution and discussing it
on other mailing lists and newsgroups and it does not appear possible.
DLLOpen is declared as a standard procedure, not a method in the 3rd
party C++ DLL, so if there are 2 instances of my component on the form,
with 2 DLL's loaded, my component doesn't know which instance the DLL is
calling, since a standard procedure occupies the same memory location in
both instances of the component.
I've got around the problem by creating 3 identical sets of global
procedures and using a global incrementing integer in the constructor,
so each new instance is given a different procedure address. The object
instance pointers are stored in a global array so the procedure knows
which instance of the object to work with. eg.
var
ObjCount: Integer;
MyObjects: array[1..3] of TMyObject
constructor Create;
begin
Inc(ObjCount);
MyObjects[ObjCount] := Self;
case ObjCount of
1: DLLOpen := Open1;
2: DLLOpen := Open2;
3: DLLOpen := Open3;
end;
end
procedure Open1(SRate,nChan,BPS:Integer):Integer; cdecl;
begin
MyObjects[1].Open(SRate,nChan,BPS);
end;
procedure Open2(SRate,nChan,BPS:Integer):Integer; cdecl;
begin
MyObjects[2].Open(SRate,nChan,BPS);
end;
procedure Open3(SRate,nChan,BPS:Integer):Integer; cdecl;
etc
This limits the number of times a user can put my component on a form,
but at least it works, and any more than 3 should not be necessary.
It would be nice if there was some way to translate a procedure call to
one address and map it to a different address transparently to the
calling DLL, then it could be fully OOP. But I don't know if this is
possible.
Regards,
Ross.
----- Original Message -----
From: <Guy.Brown at sungard.com>
To: <delphi at ns3.123.co.nz>
Sent: Monday, July 11, 2005 3:24 PM
Subject: RE: [DUG] call a method function from outside object
Hi Ross. My Delphi is a bit rusty but I believe it's just:
DLLOpen := Open;
Assuming that DLLOpen is declared as a procedure of object with the
appropriate parameter list.
hth
Guy
-----Original Message-----
From: delphi-bounces at ns3.123.co.nz [mailto:delphi-bounces at ns3.123.co.nz]
On Behalf Of Ross Levis
Sent: Sunday, 3 July 2005 5:48 p.m.
To: NZ Borland Developers Group - Delphi List
Subject: Re: [DUG] call a method function from outside object
In trying to solve this I thought of using method functions inside an
object rather than standard functions, and then assigning the method
pointer to the DLL, but I can't seem to do this either. eg. In a class
procedure I do this...
DLLOpen := TMethod(Open).Code; <<< Invalid typecast
Open is a function defined in the same class DLLOpen is the function
pointer defined in the DLL which I need to assign to the method pointer.
I'm not sure why this doesn't work. My only other option is to use
global variables!
Regards,
Ross.
----- Original Message -----
From: "Ross Levis" <ross at stationplaylist.com>
To: "NZ Borland Developers Group - Delphi List" <delphi at ns3.123.co.nz>
Sent: Sunday, July 03, 2005 4:56 PM
Subject: [DUG] call a method function from outside object
In a component I'm writing, a DLL needs access to a standard function so
this is declared outside the main object. Within this function I want
to access variables and methods inside the main object, but I can't find
a way to do it. Is this possible?
Thanks,
Ross.
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
More information about the Delphi
mailing list