CoMarshalInterThreadInterfaceInStream的用法(50分)

  • 主题发起人 主题发起人 zhfhe
  • 开始时间 开始时间
Z

zhfhe

Unregistered / Unconfirmed
GUEST, unregistred user!
在apartment的COM中如何使用,有没有范例?
 
例如:
对Ix接口的指针进行调整
IStream *pIStream = BULL;
HRESULT hr=
CoMarshalInterThreadInterfaceInStream(
IID_IX,
pIX,
&pIStream
}
 
在delphi中,pIX应该填什么?
好象还要调用QueryInterface和CoGetInterfaceAndReleaseStream?
 
另外在delphi中加入如下代码:
var
Form2: TForm2;
FStream:IStream;
Unk:IUnknown;
hr:HRESULT ;
....
CoInitializeEx(Nil,COINIT_MULTITHREADED);
hr:=CoMarshalInterThreadInterfaceInStream(IID_IChatUser
,Unk ,FStream);
ChatServer := CoChatUser.Create;
//---------------------------------------
跟踪到执行完以后Unk=nil,FStream=nil,hr=-2147024809是否正常,
但如此执行后aparment的COM多线程还是没体现出来,还是单线程应答cleint端
ShowMessage(IntToStr(hr));
 
在Delphi 中
如果
var X:IX;
填X即可
例如:
对Ix接口的指针进行反调整
IStream *pIStream = BULL;
HRESULT hr=
CoMarshalInterThreadInterfaceInStream(
pIStream,
IID_IX,
(void **)&pIXmarshaled,
}
 
现在hr=S_OK了,但如此执行后aparment的COM多线程还是没体现出来,还是单线程应答cleint端,不知是否如
下的delphi5程序有问题?
var
Form2: TForm2;
ChatServer: iChatUser;
FStream:IStream;
hr:HRESULT ;
...
procedure TForm2.btnConnectClick(Sender: TObject);
begin
CoInitializeEx(Nil,COINIT_MULTITHREADED);
ChatServer := CoChatUser.Create;
hr:=CoMarshalInterThreadInterfaceInStream(IID_IChatUser
,ChatServer ,FStream);
ChatServer.Login('ok');
...
{
TAutoObjectFactory.Create(ComServer, TChatUser, Class_ChatUser,
ciMultiInstance,tmApartment);
Client端只有主窗体Form2,无线程
ChatServer的Login方法调用了Sleep(10000);//等待10秒
如果启动两个Client端,要20秒以后第二个Client端才得到返回
另外:我的COM用使用了回调event;对Ix接口的指针进行反调整的作用是什么?
}
 
接受答案了.
 
CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream是用来在不用的apartment之间传递接口指针的。因此应该在不同线程之内调用,好像大家的理解不太对。
 
后退
顶部