现有一基于COM+的类库,导入后有如下对象声明:A3Application1: TA3Application;
A3Sessions1: TA3Sessions;其中有方法:A3Application1.GetSessions可以得到TA3Sessions实例;
声明为 function GetSessions: IDispatch; safecall; (注意:返回类型为IDispatch)我自己写的A3Sessions1 := TA3Sessions(A3Application1.GetSessions)肯定是有问题的;
问:何种写法能得到A3Sessions1?
A3Sessions1: TA3Sessions;其中有方法:A3Application1.GetSessions可以得到TA3Sessions实例;
声明为 function GetSessions: IDispatch; safecall; (注意:返回类型为IDispatch)我自己写的A3Sessions1 := TA3Sessions(A3Application1.GetSessions)肯定是有问题的;
问:何种写法能得到A3Sessions1?
解决方案 »
- delphi7 sql explorer打开 VFP5 的表出问题
- Delphi6专业版没法在WinXP以非管理员身份安装,如何解决,个人版可以么?
- Sybase连接问题.
- 加个 inherited 是什么意思?
- 怎样在win98中使任何程序都无法调用user32.dll中的ExitWindowsEx函数???
- 各位大哥能否给小弟指点迷津!!!
- 关于SQL查询出的数据的输出的问题
- ActiveForm问题,高手赐教?(其中又用到一个Active控件)
- delphi webservice可否返回窗体??若能请给一个实例源码,谢谢!
- 关于ASP组件中设置Cookie的问题。
- 关于查询排序显示的一个问题,急~~
- GBGrid显示问题,急!
如果是接口,也可以用as转换
TA3Sessions = class(TOleServer)
如何转换?
Public Overridable Function GetSessions() As Object
下边是使用:
A3Sessions1 = A3Application1.GetSessions
Dim sCount As Integer
sCount = A3Sessions1.Count
我试过了,没问题,请各位看官参考下。
A3Sessions1 := TA3Sessions(A3Application1.GetSessions)这句语法上是通过的,但:
sCount = A3Sessions1.Count这句一执行就会报错
var
A3Application1: IA3Application;
A3Sessions1: IA3Sessions;
A3Application1:=CoA3Application1.Create;
A3Sessions1:=A3Application1.GetSessions as IA3Sessions;
A3Application1: TA3Application;
A3Sessions1: TA3Sessions; ( 前边已说过: TA3Sessions = class(TOleServer) )所以你的A3Sessions1 := A3Application1.GetSessions as IA3Sessions;这句提示为:
Incompatible types: 'TA3Sessions' and 'IA3Sessions'
IA3Sessions = interface(IDispatch)
请参考。
to ysai:对象的事件又如何关联呢?如A3Sessions1.OnChange这样的事件。
to others:谢啊~
>Incompatible types: 'TA3Sessions' and 'IA3Sessions'楼主这句话看出来,A3Application1.GetSessions返回值本来就是TA3Sessions,为什么还作转换呢?2----
A3Application1: TA3Application;
A3Sessions1: TA3Sessions;
这两个东西是设计期就实例化了的? (拖的控件?? )如果没创建,下面这样难道不行吗?
A3Application1:=TA3Application.Create(nil);
A3Sessions1:=A3Application1.GetSessions;//这个封装类 函数本来就返回的TA3Sessions类型吧?
//为何要转换它?
3---
封装类有个属性DefaultInterface,可以取到对应接口..
1---->所以你的A3Sessions1 := A3Application1.GetSessions as IA3Sessions;这句提示为:
>Incompatible types: 'TA3Sessions' and 'IA3Sessions'楼主这句话看出来,A3Application1.GetSessions返回值本来就是TA3Sessions,为什么还作转换呢?>>A3Application1.GetSessions返回值是IDispatch,不是TA3Sessions
>>像as IA3Sessions这样的转换是你前边告诉我的。2----
A3Application1: TA3Application;
A3Sessions1: TA3Sessions;
这两个东西是设计期就实例化了的? (拖的控件?? )
>>这个你说的很对!已经实例化了,而且确实是被我做成控件了。如果没创建,下面这样难道不行吗?
A3Application1:=TA3Application.Create(nil);
A3Sessions1:=A3Application1.GetSessions;//这个封装类 函数本来就返回的TA3Sessions类型吧?
//为何要转换它?
>>A3Application1:=TA3Application.Create(nil); 这么写是没问题的
>>A3Sessions1:=A3Application1.GetSessions; 这么写肯定不对,因为类型不同,编译器提示:
>>Incompatible types: 'TA3Sessions' and 'IDispatch'3---
封装类有个属性DefaultInterface,可以取到对应接口..
>>取到了对应接口又如何呢,像你前边的写法不已经是利用接口方法了么,我现在真正的问题还没解决:如果用接口自己写,不知道怎么关联事件;用封装类写,不知道怎么转换对象,不知道我描述的清楚不?最后,非常欣赏你们的热情参与呀,100分已表达不出俺强烈的感谢欲望了~再次3KS!
其实把生成的类型库文件修改一下,就能满足楼主要求了。。
TA3Application = class(TOleServer)
private
FOnChange: TA3ApplicationChange;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Connect; override;
function GetA3Sessions: IDispatch;
procedure Exit;
published
property OnChange: TA3ApplicationChange FOnChange write FOnChange;
end;修改为:
TA3Application = class(TOleServer)
private
FOnChange: TA3ApplicationChange;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Connect; override;
function GetA3Sessions: TA3Sessions; //这里改了
procedure Exit;
published
property OnChange: TA3ApplicationChange FOnChange write FOnChange;
end;是这个意思吗?
A3Sessions1 := A3Application1.GetSessions; //通过
sCount := A3Sessions1.Count; //出错。。哈哈错误信息:
Project Project1.exe raised exception class EAccessViolation with message '........'.
Process stopped. Use Step or Run to continue.
TA3Sessions类的创建过程,你看一下生成的源码,它是写死了指定用COM CLASS生成,
这是必须改掉的。。或者至少应该提供方法更换Fintf成员。