现有一基于COM+的类库,导入后有如下对象声明:A3Application1: TA3Application;
A3Sessions1: TA3Sessions;其中有方法:A3Application1.GetSessions可以得到TA3Sessions实例;
声明为 function GetSessions: IDispatch; safecall; (注意:返回类型为IDispatch)我自己写的A3Sessions1 := TA3Sessions(A3Application1.GetSessions)肯定是有问题的;
问:何种写法能得到A3Sessions1?

解决方案 »

  1.   

    TA3Sessions的声明是什么?
    如果是接口,也可以用as转换
      

  2.   


    TA3Sessions = class(TOleServer)
    如何转换?
      

  3.   

    这是VB.Net里的声明:
    Public Overridable Function GetSessions() As Object
    下边是使用:
    A3Sessions1 = A3Application1.GetSessions
    Dim sCount As Integer
    sCount = A3Sessions1.Count
    我试过了,没问题,请各位看官参考下。
      

  4.   

    在DELPHI7中:
    A3Sessions1 := TA3Sessions(A3Application1.GetSessions)这句语法上是通过的,但:
    sCount = A3Sessions1.Count这句一执行就会报错
      

  5.   

    不清楚你类型库里面信息,下面接口名称只是估计
    var
      A3Application1: IA3Application;
      A3Sessions1: IA3Sessions;
      A3Application1:=CoA3Application1.Create;
      A3Sessions1:=A3Application1.GetSessions as IA3Sessions;
      

  6.   

    var
      A3Application1: TA3Application;
      A3Sessions1: TA3Sessions; ( 前边已说过: TA3Sessions = class(TOleServer) )所以你的A3Sessions1 := A3Application1.GetSessions as IA3Sessions;这句提示为:
    Incompatible types: 'TA3Sessions' and 'IA3Sessions'
      

  7.   

    另外,有这么句声明:
    IA3Sessions = interface(IDispatch)
    请参考。
      

  8.   

    试了下边的写法,也不行,有点黔驴技穷了,呵呵:A3Sessions1 := TA3Sessions(A3Application1.GetSessions as IA3Sessions);
      

  9.   

    或者不引入类型库,直接用CreateOleObject,类型库只做参考
      

  10.   

    to halfdream:我明白了,先试试你的路子。
    to ysai:对象的事件又如何关联呢?如A3Sessions1.OnChange这样的事件。
    to others:谢啊~
      

  11.   

    to halfdream:您的方法是如何处理像A3Application1.OnChange的事件的呢?
      

  12.   

    结帖前想得知最后的答案,HELP~
      

  13.   

    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,可以取到对应接口..
      

  14.   

    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!
      

  15.   

    不引入类型库,直接用CreateOleObject,类型库只做参考
      

  16.   

    用CreateOleObject的方法也可以,但对象事件如何关联?
      

  17.   

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

  18.   

    将原有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;是这个意思吗?
      

  19.   

    修改了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.
      

  20.   

    楼主,应该修改的是
    TA3Sessions类的创建过程,你看一下生成的源码,它是写死了指定用COM CLASS生成,
    这是必须改掉的。。或者至少应该提供方法更换Fintf成员。