1

たとえば、COM サーバーをホストする実行可能ファイルがありますx.exe。COM オブジェクトは、呼び出し側で次のようにインスタンス化されます。

hRes = CoCreateInstance(CLSID_InterceptX, NULL, CLSCTX_SERVER, 
                IID_IInterceptX, (void**)&pInterceptX);

それはすべてworks fine when x runs as an regular application

x.exe so that it runs as a serviceWindowsでカプセル化するツールがあります。この場合、x.exe で COM 呼び出しを受信することはありません (ログによって検証されます)。奇妙な部分は次のとおりです。呼び出し元のサイトをログに記録すると、COM オブジェクトが正常にインスタンス化されており、インターフェイス関数の呼び出しでエラーが発生していない ( SUCEEDED(hres)is true ) ことがわかります。

何か案は?

4

2 に答える 2

2

次の 3 つのうちの 1 つ (またはすべて) が起こっていると思います (可能性でソート):

(1) AppID キーのLocalService値が構成されていないため、通常のプログラムとして起動します。

(2) "srvany" (または同等の) プログラムが COM サーバーを実行するとき、サーバー オブジェクトを登録するために必要なコマンド ライン オプション ("-automation" など) を渡しません。ただし、ほとんどのフレームワークはクラス オブジェクトを自動的に登録します。サーバーに渡されたコマンドラインをログに記録して、これが当てはまるかどうかを確認します。

(3) サーバーは呼び出さずCoInitializeSecurity(ほとんどのフレームワークは呼び出しません)、AccessPermissionsを宣言しません。で確認してくださいdcomcnfg。ただし、これにより、新しいサーバーを起動するのではなく、呼び出しが失敗するはずです。

サービスがどのアカウントで実行されているかはわかりません。インタラクティブなユーザーと同じアカウントとして実行し、デスクトップとのやり取りを許可してみましたか (デバッグ手段として -- 本番環境では行うべきではありません!)?

于 2010-11-13T14:41:08.707 に答える