0

Delphi 7 で最初に開発されたアウトプロセス COM サーバーがあり、その後 D2006 で、最近 XE3 で再コンパイルされました。XE3 バージョンでは、リクエストは 1 つずつ処理されます。別のプロセスが進行中の場合、ObjectCount は増加しますが、2 番目のプロセスは最初のプロセスが終了するまで処理されません。D7/D2006 バージョンは、リクエストを同時に処理しました。

サーバーはデータベースを維持します。ほとんどのリクエストは非常に迅速に処理されますが、1 分以上かかるものもあります。アクティビティ ログを表示するメモ付きのフォームがあり、それが UI 全体です。ここで他にどのような情報が役立つかわかりません。

XE3 バージョンの動作が異なる理由はありますか? または、一般的に、2 番目のサーバー オブジェクトが最初のサーバー オブジェクトの終了を待機するのはなぜでしょうか?

これが例です。XE5 をインストールし、VCL アプリを作成し、1 つのメソッドで COM オブジェクトを追加し、テスト クライアントを作成しました。一度に 1 つの要求を処理しました。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.
4

2 に答える 2

0

上記の単純な Delphi XE5 サーバーをトレースしました。Application.Initialize -> ComServ.InitComServer -> ComObj.InitComObj -> CoInitializeEx( nil, COINIT_MULTITHREADED)、これは RPC_E_CHANGED_MODE を返します。サーバーは一度に 1 つの要求を処理します。

D2006 でコンパイルされた同じプロジェクトをトレースすると、CoInitializeEx 呼び出しは S_OK を返し、サーバーは要求を同時に処理します。

Application.Initialize への呼び出しの前に、プロジェクト ソースに CoUninitialize への呼び出しを追加しました。これにより、XE5 バージョンはリクエストを並行して処理します。これは、質問を促した本番サーバーでも機能しました。

于 2013-11-25T15:11:29.307 に答える