在线程内使用Com+接口出错(200分)

  • 主题发起人 主题发起人 yt720719
  • 开始时间 开始时间
Y

yt720719

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个使用数据库的COM+组件,但在线程内创建接口或调用接口函数时,都提示出错,向各位高手求救。
 
可能是没有初始化COM
试一试在线程构造函数中调用CoInitialize函数
在析构函数中调用CoUninitialize函数。
应该可以解决问题。
前提是你的接口函数在主线程中调用好使。
 
线程模式是哪种?是公寓式的还是自由式的?如果是前者,对全局变量要用互斥元进行保护,如果是后者,全局变量和局部变量都不是线程安全的,都要用互斥元进行保护。
 
同意慕容乾坤,
 
还有一个原因是,如果使用STA的话,不同线程间要进行接口marshal
 
我的接口实现是用的TMtsDataModule,采用的是tmApartment模式。在TComponentFactory.Create中好象已对COM进行的初始化。你说的CoInitialize函数应用在什么位置,是在接口的实现部分,还是在接口的调用部分?能否给个例子?
 
[:(]
我不是说了
“在线程构造函数中调用CoInitialize函数
在析构函数中调用CoUninitialize函数。”
还有就是你说提示出错,但是出错信息是什么啊?这可是很重要的线索啊!
 
“在线程构造函数中调用CoInitialize函数
在析构函数中调用CoUninitialize函数。”
这个做法是错误的。
Thread的构造函数在进入线程之前执行,即在主线程中。
析构函数在退出线程后执行,也是在主线程中。
所以这样做毫无意义。
应该在Execute开始进CoInitialize,在Execute退出前CoUninitialize
 
错误是“标记没有使用存储”。我今天把线程模式改为了Free模式后,可以在线程中进行创建和调用,但创建和调用都必须是在同一个线程内才行。后来我在主线程内创建了接口,而后在另一个线程内调用其函数,则出现了这么一个错误“消息筛选器拒绝这个调用”;不知是为什么。我在对这个接口调用时采用了TCriticalSection进行了保护。我是这么做的,代码如下:
procedure TDBManager.initialize;//采用了独身模式
begin
inherited;
//以下的几个都是采用了独身模式的类,其Wapper了接口
FFriend := TFriend.
Create;
FFriendGroup:= TFriendGroup.Create;
FChatMsg:= TChatMsg.Create;
FPersonInfo := TPersonInfo.Create;
end;

DBManager在主线程创建
在另一个线程中我进行了调用
PersonInfo.GetPersonInfoByID('',ErrorCode,Format('%.6d',[ParmUin]),Data);
GetPersonInfoByID方法是这么写的
FLock.Enter;
try
FPersonInfo.GetPersonInfoByID(ALoginID, AErrorCode, AUserID, AData);
finally
FLock.Leave;
end;
 
你先写一个简单的试试,是否服务器创建有问题,没事再回到你写的接口函数上来找找问题了。
 
后退
顶部