2

一部のバッチ タスクを簡素化するために、COM 自動化インターフェイスを使用して Delphi ソフトウェア プロジェクトをアップグレードしています(WSH スクリプトを使用)。それ自体は簡単です...しかし、ソフトウェアの「実際の」ユーザーのほとんどは、このインターフェイスを必要とせず(または知っていても)、COMサーバーまたはエラーメッセージの登録を惜しみませんプログラムがcomサーバーを起動できないときにポップアップします(現在、ソフトウェアにはインストーラーがありません-コピーアンドゴーです。何かを登録することは、ユーザーにとって追加のステップになります。それは社内であるため、クライアントはそれに慣れています. ..)。

実際の質問は次のとおりです。ソフトウェアを実行している現在のユーザーが COM サーバーを登録するのに十分な権限を持っているかどうかをプログラムで確認し、(そうでない場合) サーバーを作成しないようにすることはできますか? ユーザーが十分な権限を持っていない場合、自動化サーバーが存在しない (エラー メッセージが表示されない) という動作が必要です。

の周りにtry-catchを追加しようとしましたTAutoObjectFactory.Create(...)が、それはエラーを防ぎません。サーバーを有効にするコマンド ライン パラメーターを追加しても機能しません。スクリプトから自動化オブジェクトを作成すると、そのパラメーターなしでプログラムが開始され、サーバーも作成されないためです。

4

2 に答える 2

1

これを解決するために、メソッドTMyAutoObjectFactoryを継承し、暗黙のtry/except 句でTAutoObjectFactoryオーバーライドするだけのオブジェクトを使用し、それを使用するように下部の初期化セクションを更新します。UpdateRegistryこのような:

type
  TMyAutoObjectFactory=class(TAutoObjectFactory)
  public
    procedure UpdateRegistry(Register: Boolean); override;
  end;

{ TMyAutoObjectFactory }

procedure TMyAutoObjectFactory.UpdateRegistry(Register: Boolean);
begin
  try
    inherited;
  except
    //silent
  end;
end;

initialization
  TMyAutoObjectFactory.Create(ComServer, TMyObjectSomething, Class_MyObjectSomething, ciMultiInstance, tmApartment);
end.

これでエラーは消えますが、管理者権限でアプリを 1 回実行するか、インストーラーに必要なレジストリ エントリを追加してもらう必要があります。

于 2014-06-19T11:20:22.730 に答える
0

Comserver.InitializeDelphis comserv-unit をプロジェクトにコピーし、 -method(-body)の周りに try-except ブロックを配置することで問題を解決しましたTAutoObjectFactory

PROCEDURE TComServer.Initialize;
BEGIN
  TRY
    TRY
      UpdateRegistry(FStartMode <> smUnregServer);
    EXCEPT
      ON E: EOleRegistrationError DO
      // User may not have write access to the registry.
      // Squelch the exception unless we were explicitly told to register.
        IF FStartMode = smRegServer THEN RAISE;
    END;
    IF FStartMode IN [smRegServer, smUnregServer] THEN Halt;
    ComClassManager.ForEachFactory(Self, FactoryRegisterClassObject);
  EXCEPT
  ELSE
    FStartSuspended := true;
  END;
END;

注: 外側の try ブロックのみが私のものです。残りは Delphi5(!) に付属するオリジナルです。これはエラーを抑制しているようです(誰かが尋ねる前に:はい、サーバーが実行されていないことは知っていますが、それが望ましい結果です。少なくともプログラムは起動します-とにかく、プログラム全体が起動しない理由がわかりませんサーバーは登録できません)。

PS:これを受け入れられた回答として設定していません。これは、ComServer が半分初期化されたままになるため、ハックのように「感じる」ためです。副作用があるかどうかはわかりません...

于 2014-06-24T06:59:49.387 に答える