如题

解决方案 »

  1.   

    最好给出CoMarshalInterThreadInterfaceInStream 和 CoGetInterfaceAndReleaseStream 这两个 API函数的使用例子
      

  2.   

    其实这也是一个旧问题的新问:server端服务器用multi,apartment模式,写了一个方法:function Tappserv.CallApp(var Input: OleVariant): OleVariant;
    begin
    result:=DateTimeToStr(Now);
    end;client端用多线程来调用CallApp:
    procedure TThreadQuery.ConnectDataSource;
    var
    input,outs:variant;
    begin
    input:=VarArrayCreate([0,5],VarVariant);
    outs:=VarArrayCreate([0,5],VarVariant);
    input[0]:='put';
    outs[0]:=form1.DCOMConnection1.AppServer.callapp(input);//每当执行到这里就出错“应用程序调用一个已为另一线程整理的接口”。
    end;procedure TThreadQuery.Execute;
    begin
    try
    CoInitializeEx(nil,COINIT_APARTMENTTHREADED);
     try
         ConnectDataSource;
      except
        ShowMessage('Error');  
      end;
    finally
     CoUnInitialize;
    end;
    end;怎样才能解决???????
    回答如下:DCOMConnection 随窗体创建时, 从 DCOMConnection.AppServer 中获取的接口只能在主线程中使用。要在分线程中能使用该接口,需要如下操作:在主线程中,即在 TYourThread.Create 时,使用 CoMarshalInterThreadInterfaceInStream 把接口 Marshal 到 Stream 中,然后在 TYourThread.Execute 中使用 CoGetInterfaceAndReleaseStream 从 Stream 中恢复接口。
    这样就可以使用接口了。CoMarshalInterThreadInterfaceInStream 和 CoGetInterfaceAndReleaseStream 这两个 API 的用法参考 MSDN。小弟比较愚笨,一:不知道如何使用上述两个函数。二:这样书写代码的目的是什么?难道是为了提高com或com+的效率吗?  分数有点少,但是学习是关键,如果能共同提高,我愿意再奉送80分
      

  3.   

    COM中有下面一些使用规则。。
    1,从一个线程调用Coinitliaze开始,到CoUninitliaze结束,这段区域称为套间(appartment)。
    COM对象接口必须在套间内创建和使用。
    2,接口指针不能跨套间使用,也就是说,在A套间创建的接口指针不能在B套间使用。
    3,A套间创建的接口指针可以Marshal--》UnMarshal 在B套间生成一个新的接口指针,然后B 套间可以用它。
    4,跨套间有几种情况:跨线程,跨进程,远程,都可以用Marshal机制 抽象的统一处理。
    5,Marshal 机制简单的说是在当前套间生成一个代理对象用来调用实际对象。
    CoMarshalInterThreadInterfaceInStream 和 CoGetInterfaceAndReleaseStream 
    这两个东西看名字大概就可以知道它意思。
    前者是Marshal一个接口到Straem中。
    后者是从一个Stream中UnMarshal一个接口指针,并释放这个stream.
      

  4.   

    既然是对COM操作这么基本的东西,那自然是Activex单元里。