服务器com+ 返回一个olevariant 数据
function Getdata(a: SYSINT): OleVariant;
但由到数据传递较慢。
所以想到用线程获取。接口是在主程序中产生的。现在的问题是:如何在线程中将这个返回值传回给主程序?thread=class(thread)
private
  if: iinterface;
public
constrcutor create(ii: iinterface);override;
procedure thread.execute;
end;constrcutor create(ii: iinterface);override;
begin
  if := ii;
end;
procedure thread.execute;
var
 ole: olevariant;
begin
  //执行到此时提示未初始化CoInitialize,但加了又提示在另一线程中XXXXXXXX....
  ole := if.Getdata;  
end;该如何将接口的返回值返回给主程序?
如果该方式不合理,望各位不吝赐教。

解决方案 »

  1.   

    是, 两个原因
    所有访问 com 的程序都要作 CoInitialize 和 CoUninitialize(这个你也要作, 释放 COM 代理)
     
    加也后不行是因为你的对像是在主线程中建立的, COM 对像跨线程是不行的, 要跨得作编组, 不过对你而且没必要这么麻烦, 你只要在线程中建立这个对像就好了, 就是说你 Create改改, 送进服务对像 GUID, 在里面建立就好了吧
      

  2.   

    谢谢 comanche(太可怕) 如果在线程中创建com对象。那又该如何从线程中将
    function Getdata(a: SYSINT): OleVariant;
    返回值传回主线程?可以写成这样吗?
    thread=class(thread)
    private
      if: iinterface;
      ole: olevariant;
      fole: olevariant;
      procdure update;
    public
    constrcutor create(ii: iinterface;var ole1: olevariant);override;
                                     ~~~~~
    procedure thread.execute;
    end;constrcutor create(ii: iinterface;var ole1: olevariant);override;
    begin
      if := ii;
      ole := ole1;
    end;procedure thread.execute;
    begin
      fole := if.Getdata;  
      Synchronize(update);
    end;procedure update;
    begin
      ole := fole;
    end;
      

  3.   

    用 var 送进来的啊, ole := ole1; 这样只是值 copy, 结果就没写回到原变量里这地方可以用一个事件来实现的yourthread=class(thread)
    ...
    public
      OnComplete: TNotifyEvent read FOnComplete write FOnComplete; 完成通知, 让调用者自已去挂接接收事件
      RetVal: OleVariant read FRetVal; // 定义结果属性
    end;execute 不改procedure update; 改成
    begin
      if Assigned(FOnComplete) then FOnComplete(Self{自已});
    end;
    调用都这边procedure xxx.DoDownloadComplete(sender: TObject) 事件
    begin
      (Sender as TyourThread).RetVal; 这个你可以给任何对像
    end;
      

  4.   

    对啊,我真是笨啊,这都没想到太谢谢 comanche(太可怕) !其实昨天这么写过呢。
    因为不怎么用过thread所以一直在execute、Synchronize这里面想着怎么传,搞得脑子都不灵光了。