关于ActiveX接口问题(200分)

  • 主题发起人 主题发起人 foxweb
  • 开始时间 开始时间
F

foxweb

Unregistered / Unconfirmed
GUEST, unregistred user!
客户提供了3个ActiveX的控件,并提供相关文档
但给的例子是Vb的,代码如下
Dim WithEvents Objtest As Test1.PTest
Dim WithEvents Objtest2 As Test2.Ntest2
Dim WithEvents ObjSvr As svr.dDsvr

Set ObjSvr = New dDsvr
Set Objtest2 = ObjSvr.GetNTestSet
Set Objtest = ObjSvr.GetPTestSets

以上的ObjSvr.GetNTestSet和ObjSvr.GetPTestSets在vb中返回为Unknown类型,但可以直接赋值给Objtest2 和Objtest
请问我在delphi 应该怎么写?我将这3个控件导入delphi里,写的代码如下
var
Objtest : TPTest;
Objtest2 : TNtest2;
ObjSvr : TdDsvr;
begin
objSrv := TdDsvr.Create(self);
Ntest2 = ObjSvr.GetNTestSet;
PTest = ObjSvr.GetPTestSets;
end;
这样写,我试过了,不行,因为GetNTestSet和GetPTestSets返回值为IInterFace,
强制类型转换也不行,虽然可以运行,但没有任何结果
请高人,达人帮帮忙,小弟在此拜谢
 
var
Objtest : IPTest;
Objtest2 : INtest2;
ObjSvr : IdDsvr;
begin
objSrv := TdDsvr.Create(self) as IdDsvr;
Ntest2 := ObjSvr.GetNTestSet;
PTest := ObjSvr.GetPTestSets;
end;
 
TYZhang大侠,你的答案不对,客户提供的文档函数定义如下
HRESULT GetNTestSet([out,retval] IUnknown** ppNtestSets);
HRESULT GetPTestSets([out,retval] IUnknown **ppPtestSets);
为什么vb下可以直接赋值,delphi不行呢?

 
能不能直接赋值,取决于它的创建方式,试试这样:
var
Objtest : IPTest;
Objtest2 : INtest2;
ObjSvr : IdDsvr;
begin
objSrv := TdDsvr.Create(self) as IdDsvr;
Ntest2 := ObjSvr.GetNTestSet as INtest2;
PTest := ObjSvr.GetPTestSets as IPTest;
end;
 
如果用你的文档的方式可以这样调用:
var
Objtest : IPTest;
Objtest2 : INtest2;
ObjSvr : IdDsvr;
I:IUnknown;
begin
objSrv := TdDsvr.Create(self) as IdDsvr;
if ObjSvr.GetNTestSet(I)=0 then Ntest2 := I as INtest2;
if ObjSvr.GetPTestSets(I)=0 then PTest := I as IPTest;
end;

 
不行,问题出在赋值,
Objtest : TPTest;
Objtest2 : TNtest2;
ObjSvr : TdDsvr;
这三个都是定义的类

HRESULT GetNTestSet([out,retval] IUnknown** ppNtestSets);
HRESULT GetPTestSets([out,retval] IUnknown **ppPtestSets);
这两个函数返回的是接口,我的问题是,如何把函数返回的接口,赋值给类
 
接口与类是一样使用,而类是delphi对接口的封装,有类可以通过as转为接口,但,只有接口要转为类,需要初始化很多数据,比较烦,你可以看一下delphi的源码。
 
谢谢TYZhang大侠,问题已经解决,原来类提供了一个ConnectTo的方法将接口绑定到类上
怪自己太粗心,呵呵 200分送上
 
后退
顶部