CoMarshalInterThreadInterfaceInStream引用什么单元? 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 最好给出CoMarshalInterThreadInterfaceInStream 和 CoGetInterfaceAndReleaseStream 这两个 API函数的使用例子 其实这也是一个旧问题的新问:server端服务器用multi,apartment模式,写了一个方法:function Tappserv.CallApp(var Input: OleVariant): OleVariant;beginresult:=DateTimeToStr(Now);end;client端用多线程来调用CallApp:procedure TThreadQuery.ConnectDataSource;varinput,outs:variant;begininput:=VarArrayCreate([0,5],VarVariant);outs:=VarArrayCreate([0,5],VarVariant);input[0]:='put';outs[0]:=form1.DCOMConnection1.AppServer.callapp(input);//每当执行到这里就出错“应用程序调用一个已为另一线程整理的接口”。end;procedure TThreadQuery.Execute;begintryCoInitializeEx(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分 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. 既然是对COM操作这么基本的东西,那自然是Activex单元里。 关于ToolButton继承 节气歌,二十五章 请高人诊断一下这个if嵌套语句 delphi调用存储过程,返回值的问题? 怎么样找到中文字的进程?内有代码,可以找到字母型的。急~~!!! 请高手赐教!!! 急!将HWND类型的数据转换成STRING,类似INTTOSTR的功能 如何进行坐标的单位变换?up有分!! !!!!!!!非技术问题,先声明,别骂我! 如何实现分公司数据库与总公司数据库的定时数据更新 程序员的好去处 [调查]开发医疗信息化软件的请进哦,顶者有分!
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分
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.