カスタム COM サーバーの実装があります。サーバーは TComObjectFactory を使用して、クライアント接続に使用される COM オブジェクトを作成しています。
私は次のように書いていました。
function TPsOPCProviderClientFactory.CreateComObject(const Controller:
IUnknown): TComObject;
begin
FStartupCompleteEvent.WaitFor(INFINITE);
if Provider.State = OPC_STATUS_SUSPENDED then // Server already shutdown
raise EAbort.Create('Server shut down.');
Result := inherited CreateComObject(Controller);
(Result as TPsOPCProviderClient).Provider := Provider;
end;
FStartupCompleteEvent は、最初の接続が通過する前にアプリケーションの準備が整っていることを確認するために使用され、Provider.State は、サーバーがシャットダウンするときにクライアント接続を無効にするために使用されます。
これは、オブジェクトの作成をキャンセルする適切な方法ではないようです。例外が発生すると、画面に「DAX エラー」ポップアップを含むメッセージ ダイアログが表示され、クライアントがクラッシュする可能性があります。
オブジェクトの作成を失敗させる正しい方法は何ですか?または常に成功することは必須ですか?
コードは、Delphi 5 以降のすべての Delphi/C++Builder バージョンで利用可能なコンポーネント フレームワークで使用されます。