1

OLEオートメーションサーバーを作成しました(Delphiを使用)。私は通常、OLEサーバーを手動で起動し、通常のアプリケーションとして使用します。時々、既存のOLEサーバーに自動的に接続するクライアントを起動します。

クライアントを終了すると、サーバーは終了しません(少なくとも、クライアントの前に手動で起動した場合)が、他のOLE接続は受け入れられません。別のクライアントを起動すると、最初のサーバーを再利用する代わりに、新しいサーバーがトリガーされます。

同じサーバーを2番目のクライアントで再利用するにはどうすればよいですか?

(質問は正しく再定式化するために編集されました。元のバージョンでは、サーバーが終了しないようにする方法を尋ねていましたが、これは適切な定式化ではありませんでした)

4

6 に答える 6

3

Delphi の COM オブジェクト ウィザードには、「インスタンス化」という設定があります。許可される値は、「内部」、「複数インスタンス」、「単一インスタンス」です。

複数のクライアントで同じ COM サーバーを再利用したいと考えていました。そのため、「単一インスタンス」を選択しましたが、すべてのクライアントに対してサーバー アプリケーションの単一インスタンスを使用します。しかし、私は間違っていました。「単一インスタンス」とは、サーバーに COM 接続のインスタンスが 1 つだけ存在することを意味します。同じサーバーで複数の COM 接続 (ただし、同時ではなく次々に接続) を許可するには、「複数インスタンス」を選択する必要がありました。

Delphi の COM Object Wizard で使用される用語は、あまり明確ではないと思います。「複数インスタンス」、「単一インスタンス」ではなく、OLE サーバーと VB に関するこの記事のように、「複数使用」と「単一使用」を使用する方がよいでしょう。

于 2009-02-02T08:55:20.857 に答える
2

クライアントで、使用します

ConnectKind := ckRunningOrNew

また、新しいサーバーを開始する代わりに、既存のサーバーを使用する必要があります。

于 2009-01-30T15:22:22.107 に答える
0

サーバーを通常のアプリケーションとして起動すると、自動化サーバーの参照カウンターをインクリメントできるはずです。達成したいことは2つあります。クライアントが終了したときにサーバーが終了しないようにすることと、クライアントの実行中にメインフォームを閉じたときにサーバーが終了しないようにすることです。

于 2009-01-30T15:07:34.290 に答える
0

COMオブジェクトをシングルトンとして作成します。また、クライアントが移動した後もオブジェクトを実行し続けるために、追加の参照カウントを追加します。これを行うには、COMオブジェクト内でQIを1回呼び出します。

于 2009-01-30T15:13:49.833 に答える
0

前回の記事「Delphi の COM オブジェクト ウィザードに「インスタンス化」という設定があります」についてのメモ。: 少なくとも C++ ビルダーでは、このオプションは後でプロジェクト設定の項目 "ATL" で簡単に変更できます。この項目は、最初の自動化オブジェクトを追加した後、EXE-ole-server に対してのみ表示されます。

(また、この素晴らしいページの著者に、項目 18 でこれについて言及するように依頼しました。)

于 2009-12-12T10:28:20.330 に答える
0

OLE サーバーを起動するユーザーの ID を変更することもできます (それが dll ではなく Exe である場合)。dcomcnfg を実行し、[コンポーネント サービス]、[コンピューター]、[マイ コンピューター]、[DCOM 構成] の順に選択してサーバーを選択します。

あなたはそれをいじる必要があるかもしれません.それらすべての違いを思い出すことはできませんが、「インタラクティブユーザー」がそれを行うべきだと思います.

于 2009-12-12T22:56:53.063 に答える