如下:
Taa = class(TMtsAutoObject, Iaa)
private
  FUserID: WideString;
protected
  procedure SetInit(const pUserID: WideString); safecall;
  procedure GetUserID(out pUserID: WideString); safecall;
end;procedure SetInit(const pUserID: WideString); safecall;
begin
 try
   FUserID := pUserID;
   setcomplete;
 except
   SetAbort;
 end;
end;
procedure GetUserID(out pUserID: WideString); safecall;
begin
 try
   pUserID := FUserID;
   setcomplete;
 except
   SetAbort;
 end;
end;
客户端调用:
procedure TForm1.Button1Click(Sender: TObject);
var
 aa: Iaa;
 sTemp: WideStirng;
begin
  aa := coaa.Create;
  aa.SetInit('001')
  aa.GetUserID(sTemp);
  ShowMessage(sTemp);
end;按设想,结果应该是:001
实际上是空。
因为Private的变量并没有为下一个方法而保留本次方法赋予的值。
请问各位,在COM+环境下是如何保留本次对象调用期间的公有变量。

解决方案 »

  1.   

    看了你的问题
    感觉你没有把值带出来
    你的Stemp没有分配内存
    你试试先指向自己的一个值然后再往出带
      

  2.   

    to Focus:
    按照你的说法,讲GetUserID方法改造:
    procedure GetUserID(out pUserID: WideString); safecall;
    begin
     try
    //   pUserID := FUserID;
       pUserID := 'abc';  //赋予常量值
       setcomplete;
     except
       SetAbort;
     end;
    end;结果:abc。
    问题还是没有解决。在COM+组件中公有变量的值只在当前方法中保留,方法执行完毕即释放。
      

  3.   

    真是这样么?我在组件中定义了很多Private的接口指针,都是可以保存的。
      

  4.   

    是让你在客户端定义数据指针指向一片内存
    然后再把这个值用@带出来
    你没有弄明白我的意思 
    或者你可以试一下copy
      

  5.   

    试了一下,注册到COM+服务中果然如此,取不到私有变量的值,可是如果注册成普通的COM则可以,也就是不放在COM+的环境里就可以,COM+号称是无状态的,果然不错。
      

  6.   

    哦原来是因为COM+
    平时的话总在用COM
    没怎么用COM+
    这就难怪了
      

  7.   

    在类里面加了私有成员,就是增加了状态。
    使用COM+ 同使用COM其实思路改进很多的。。
      

  8.   

    非常感谢各位披星戴月为我解答问题!
    嘿嘿,那只有在每个方法里增加初始化的参数了。700多个方法
    to Apple
    我也在Private域里定义了接口变量,但一直没有发现这个问题,在我使用private变量(数值变量)时才发现这个问题。嘿嘿,大发现啊。