1

IDispatch Invoke を介して呼び出されるいくつかの COM 関数を公開している Windows サービスがあります。いつでもこれらの関数を呼び出すことができるさまざまなクライアント (Windows アプリケーション) があります。クライアントの変更を必要としない変更を Windows サービスに導入する必要があります (クライアントを変更することはできません)。どのアプリケーションが関数を呼び出しているか (ID など) を区別する必要があります。注: 正確なクライアント アプリケーションを知る必要はありません。現在のセッション内のさまざまなクライアントを区別するだけで十分です。

例: 2 つのクライアント C1 と C2 があるとします。C1 が Windows サービス (WS) で関数 F1 を呼び出すと、WS はそのたびに (現在のセッション中に) クライアント X1 (X1 と言ったことに注意してください。 PID~プロセスID~のようなC1へのID)。したがって、C3 が F2 を呼び出すと、WS はクライアント X2 (X1 とは異なります) が F2 を呼び出したことを認識します。そして、再び C1 が FX を呼び出します (WS によって公開された任意の COM 関数) WS は、クライアント Xn (X2 など) が FX を呼び出したのではなく、X1 が FX を呼び出したことを区別できます。

クライアントからの ID 引数を必要とせずに、この状況を達成するのに役立つものはありますか?

4

2 に答える 2

0

私が最初に考えたのは、サーバー内のクライアントの IUnknown アドレスを単純に比較することです。2 つの呼び出しに同じ IUnknown がある場合、それらは同じプロキシを使用しており、同じクライアントから発信されている必要があります。

CoGetCallerTIDを使用して、一種のクライアント識別子を取得することもできます。この COM API 関数は、呼び出し元のアパートメントの ID を返します。通常、これは呼び出し側プロセスで実行されているスレッドのスレッド ID です。これを確実にするためにプロセス ID も必要になるため、これはすべての呼び出し元で一意であるとは限りません。

他の COM API 関数を調べてみると、他の可能性が明らかになるかもしれません。CoGetObjectContextは、 IContextインターフェイスを介して使用可能になったプロパティを特定できる場合に便利なようです。ドキュメントはそれらについてあまり近づきません。

于 2015-06-10T09:27:59.217 に答える