我有一个进程外COM服务器,最初是在Delphi 7中开发的,然后是D2006,最近在XE3下重新编译了。在XE3版本下,一次处理一个请求。如果一个进程正在进行而另一个进程进入,则ObjectCount会增加,但是第二个进程直到第一个进程完成时才会处理。D7 / D2006版本同时处理请求。
服务器维护一个数据库。大多数请求处理速度非常快,但有些请求则需要一分钟或更长时间。有一个带有备注的表单,其中显示了活动日志,即整个UI。不知道还有哪些其他信息会在这里有所帮助。
为什么XE3版本的行为会有所不同?或者,通常,为什么第二个服务器对象可能要等待第一个服务器对象完成?
这是一个例子。我安装了XE5,创建了VCL应用程序,并使用一种方法添加了COM对象,并创建了测试客户端。它一次处理一个请求。我在D2006中编译了相同的项目(只需要删除单元前缀),它就可以同时处理它们。
我究竟做错了什么?
unit Unit2;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl;
type
TTest = class(TTypedComObject, ITest)
protected
function Method1(N: Integer): HResult; stdcall;
end;
implementation
uses ComServ;
function TTest.Method1(N: Integer): HResult;
var I: Integer;
begin
for I := 1 to N do
Sleep( 1000);
end;
initialization
TTypedComObjectFactory.Create(ComServer, TTest, Class_Test,
ciMultiInstance, tmFree);
end.
我通过上面的简单Delphi XE5服务器进行了跟踪。Application.Initialize-> ComServ.InitComServer-> ComObj.InitComObj-> CoInitializeEx(nil,COINIT_MULTITHREADED),它将返回RPC_E_CHANGED_MODE。服务器一次处理一个请求。
遍历在D2006下编译的同一项目时,CoInitializeEx调用返回S_OK,并且服务器同时处理请求。
我在调用Application.Initialize之前在项目源代码中添加了对CoUninitialize的调用。这样,XE5版本会同时处理请求。这也适用于提示问题的生产服务器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句