C++Builder 5中的COM怎样才能“多线程”?(300分)

  • 主题发起人 主题发起人 op
  • 开始时间 开始时间
O

op

Unregistered / Unconfirmed
GUEST, unregistred user!
COM服务端:
用[File]->[New...]->[ActiveX]->[Automation Object]建立COM服务端,选择Apartment线程模式。
新建COM对象:Test
新建COM接口:ITest
新建ITest接口的方法:ITest->GetID(int* AThreadID,int* AInstanceID);
//AThreadID返回线程ID,用GetCurrentThreadID()获得;
//AInstanceID返回实例ID,用int(this)获得;
COM客户端:
IUnknown* pUnknown;
ITest* pTest;
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
// 这里表明是Apartment线程模式了。
CoCreateInstance(CLSID_Test,NULL,CLSCTX_ALL,IID_IUnknown,(void**)&pUnknown);
pUnknown->QueryInterface(IID_ITest,(void**)&pTest);
pUnknown->Release();
//以上获得了pTest。
DWORD ThreadID,InstanceID;
pTest->GetID(&ThreadID,&InstanceID);
ShowMessage(IntToStr(ThreadID)+" "+IntToStr(InstanceID));
//以上显示了COM服务端的ThreadID,InstanceID

CoUninitialize();

我运行多个客户端,得到的结果是: ThreadID 相同,InstanceID不同,这表明服务端是单线程。
我认为客户端应该没问题,因为有COINIT_APARTMENTTHREADED在。
问题可能出在服务端。
请问当多个客户端连上来时,服务端如何产生多个Apartment来服务这些客户端?
我知道Delhpi 5 默认就能实现多线程,但C++Builder 5不同,到底应该加哪些代码?


 
建议把问题放到MIDAS / DCOM中去。(不是玩笑)
这点分数就给我吧。
xixi.(开个玩笑)
 
难道没人懂COM编程吗?
不甘心就这样让这个问题石沉大海,所以添几行字,好让它再浮出水面。
(我一定要搞清楚这个问题,所以请高手一定赐教,不胜感激。)
 
服务段要实现"多线程",要用free线程模式,Apartment似乎是不行的吧。
你说"Delhpi 5 默认就能实现多线程",是指apartment模式吗?
你是否用上述方法在delphi中作过试验,得到的threadID是不同的吗?
 
>Delhpi 5 默认就能实现多线程
Delhpi 5是通过TComponentFactory给你生成多个apartment,但是这并不代表apartment
是多线程.实际上,apartment自己就指明了它不是Thread-safe.
你做的COM对象是一个In-Process Server, 它运行在Client的进程中,不同的Client的进程
会建立不同的实例,所以它的InstanceID不同.
Delhpi 5的MIDAS做的AppServer是一个Out-Process Server,Delhpi 5的AppServer
对于不同的Client的进程在其内部建立一个不同的apartment.
 
大家都去看看 Hongjiang 在 OLE/Automation 中对 "Application Server 线程模型" 问
题的发言吧,应该会有所收获。我也想知道如何让 Delphi 5 的 AppServer 对应 Client
的每一个 Thread 能建立一个新的 Thread 来提供服务,Hongjiang 能否再说明一下?
 
To bbkxjy:
Delphi 5 的 AppServer 通过TComponentFactory调用TApartmentThread来生成多个
Apartment COM对象实现AppServer的多线程,但是其要求是AppServer为独立的EXE,
我的感觉是TComponentFactory它有点像MTS或COM+中的Surrogate(MTX.EXE/DLLHOST.EXE).
对于多个Client, 它能生成多个线程来对应, 这一点我想你已经了解了,但对应一个Client
中的多个线程来说, 根据我对Delphi 5的代码的观察来看, 应该在Client的各个线程中
建立你的DataModule, 而不是各个线程公用一个DataModule, 这样的话, Delphi 5的
TDispatchConnection会建立多个远程DataModule来对应. 因为我一般用VC++做MTS和
COM+作为中间层, 用Delphi做的不多, 所以不知道理解的正不正确.
 
多人接受答案了。
 
后退
顶部