真的没人知道? (200分)

  • 主题发起人 主题发起人 xingxingz
  • 开始时间 开始时间
X

xingxingz

Unregistered / Unconfirmed
GUEST, unregistred user!
200分求助:知道接口的ClassId、IId,怎样获取接口Interface里面的方法?

现在有接口A,接口B,都有方法GiveMeHelp,
怎样根据不同接口的的 ClassId, IId获得不同接口的 GiveMeHelp 方法
我想实现一个方法传入接口的ClassId或IId就可以实现这样的功能。


接口A: IInterfaceA
ClassId: CLASS_InterfaceA TGUID
IId : IId_IInterfaceA TGUID
接口A实现方法: GiveMeHelp();

接口B: IInterfaceB
ClassId: CLASS_InterfaceB TGUID
IId : IId_IInterfaceB TGUID
接口B实现方法: GiveMeHelp();



function GiveMeHelpByCOM(ClassId: TGUID; IId: TGUId)
begin
// 根据不同接口的的 ClassId, IId获得不同接口的 GiveMeHelp 方法

???请指点!

end
 
老兄,如果你已经做好了classA和classB两个com服务器,并注册了她们,这不是小菜,
创建一个com对象,可以根据classA和classB的guid创建com对象啊,而查找接口可以根据
iinterface guid查找接口啊,不就解决了,但是你要理解的是,接口里面的方法应该有接口
调用,而不是把他传给其他的什么过程,否则容易产生com对象已经释放,那么你得到的函数
指针是什么呢?
---可能我并没有理解你的问题的关键所在!
 
使用相应的iid(接口标识符和GUID全局唯一描述符好象一样的)建立com对象,然后使用对
象来使用接口中的方法.
 
这个好说把下面代码xcopy运行一下,搞不定我倒赔你200分
不过那连个guid可得自己重新生成阿(ctrl + shift + G) ^_^
还有一个class实现你的两个接口就行了,不用注册连个class,太浪费了,delphi和java都
支持实现多个接口的,爽阿。。。不过你非要两个我也没办法^_^
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
//接口对象1
IInt1=interface
['{EBF2B313-0CF9-44F3-95B1-9679096269A6}']
function GetStr:string;
end;
TInt1Impl = class(TInterfacedObject,IInt1)
function GetStr:string;
end;
//接口对象2
TInt1OtherImpl = class(TInt1Impl,IInt1)
public
function GetStr:string;
end;
//接口对象3
IInt2 = interface
['{85A13689-2BD4-48F9-AC93-0174B2C28C97}']
function GetStr:string;
end;
TInt2Impl = class(TInterfacedObject,IInt1,IInt2)
public
function IInt2.GetStr=__GetStr;
function GetStr:string;
function __GetStr:string;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.dfm}
//接口对象1
function TInt1Impl.GetStr: string;
begin
Result:= 'TInt1Impl.GetStr' ;
end;
//接口对象2
function TInt1OtherImpl.GetStr: string;
begin
Result:= 'TInt1OtherImpl.GetStr' ;
end;
//接口对象3
function TInt2Impl.__GetStr: string;
begin
Result:='IInt2.GetStr';
end;
//接口对象3
function TInt2Impl.GetStr: string;
begin
Result:='IInt1.GetStr';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
m_int:IInt1;
begin
m_int:=TInt1Impl.Create;
ShowMessage(m_int.GetStr);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
m_int:IInt1;
begin
m_int:=TInt1OtherImpl.Create;
ShowMessage(m_int.GetStr);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
m_int:IInt1;
begin
m_int:= TInt2Impl.Create;
ShowMessage(m_int.GetStr);
end;
end.
 
后退
顶部