COM+高手进

Sail365 2004-12-29 12:08:18
现有一基于COM+的类库,导入后有如下对象声明:

A3Application1: TA3Application;
A3Sessions1: TA3Sessions;

其中有方法:A3Application1.GetSessions可以得到TA3Sessions实例;
声明为 function GetSessions: IDispatch; safecall; (注意:返回类型为IDispatch)

我自己写的A3Sessions1 := TA3Sessions(A3Application1.GetSessions)肯定是有问题的;
问:何种写法能得到A3Sessions1?
...全文
297 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sail365 2004-12-31
  • 打赏
  • 举报
回复
收到~
halfdream 2004-12-31
  • 打赏
  • 举报
回复
楼主,应该修改的是
TA3Sessions类的创建过程,你看一下生成的源码,它是写死了指定用COM CLASS生成,
这是必须改掉的。。或者至少应该提供方法更换Fintf成员。
halfdream 2004-12-30
  • 打赏
  • 举报
回复
1----

>所以你的A3Sessions1 := A3Application1.GetSessions as IA3Sessions;这句提示为:
>Incompatible types: 'TA3Sessions' and 'IA3Sessions'

楼主这句话看出来,A3Application1.GetSessions返回值本来就是TA3Sessions,为什么还作转换呢?

2----
A3Application1: TA3Application;
A3Sessions1: TA3Sessions;
这两个东西是设计期就实例化了的? (拖的控件?? )

如果没创建,下面这样难道不行吗?
A3Application1:=TA3Application.Create(nil);
A3Sessions1:=A3Application1.GetSessions;//这个封装类 函数本来就返回的TA3Sessions类型吧?
//为何要转换它?


3---
封装类有个属性DefaultInterface,可以取到对应接口..




Sail365 2004-12-30
  • 打赏
  • 举报
回复
结帖前想得知最后的答案,HELP~
Sail365 2004-12-30
  • 打赏
  • 举报
回复
修改了LIB后实验的结果:

A3Application1 := TA3Application.Create(nil); //通过
A3Sessions1 := A3Application1.GetSessions; //通过
sCount := A3Sessions1.Count; //出错。。哈哈

错误信息:
Project Project1.exe raised exception class EAccessViolation with message '........'.
Process stopped. Use Step or Run to continue.
Sail365 2004-12-30
  • 打赏
  • 举报
回复
将原有LIB代码:
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;

是这个意思吗?
Sail365 2004-12-30
  • 打赏
  • 举报
回复
哦?好象有那么点意思,但是,我还没想好~
caiso 2004-12-30
  • 打赏
  • 举报
回复
顶一下
halfdream 2004-12-30
  • 打赏
  • 举报
回复
哦。。呵呵。刚才回贴还没有说到楼主想要的。。。

因为自动生成的封装类不是那么满意,TA3Sessions里面创建的COM对象类是静态指定的,
其实把生成的类型库文件修改一下,就能满足楼主要求了。。

Sail365 2004-12-30
  • 打赏
  • 举报
回复
谢谢!再给看看吧,要放假了
Sail365 2004-12-30
  • 打赏
  • 举报
回复
用CreateOleObject的方法也可以,但对象事件如何关联?
mxj2000 2004-12-30
  • 打赏
  • 举报
回复
不引入类型库,直接用CreateOleObject,类型库只做参考
Sail365 2004-12-30
  • 打赏
  • 举报
回复
to halfdream: 是这样子的:
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!
ysai 2004-12-29
  • 打赏
  • 举报
回复
TA3Sessions的声明是什么?
如果是接口,也可以用as转换
Sail365 2004-12-29
  • 打赏
  • 举报
回复
给看看啊!谢谢~
Sail365 2004-12-29
  • 打赏
  • 举报
回复
to halfdream:您的方法是如何处理像A3Application1.OnChange的事件的呢?
Sail365 2004-12-29
  • 打赏
  • 举报
回复
to halfdream:我明白了,先试试你的路子。
to ysai:对象的事件又如何关联呢?如A3Sessions1.OnChange这样的事件。
to others:谢啊~
ysai 2004-12-29
  • 打赏
  • 举报
回复
或者不引入类型库,直接用CreateOleObject,类型库只做参考
halfdream 2004-12-29
  • 打赏
  • 举报
回复
看来楼主没有明白我的意思。。
我是建议楼主使用接口,而不要去用生成的封装类。。
fayeflash 2004-12-29
  • 打赏
  • 举报
回复
帮你顶上去!
加载更多回复(9)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧