Delphi COM服务器一次处理一个请求

大卫·史密斯

我有一个进程外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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章