2

サードパーティのアウトプロセス COM サーバーと、それをアクティブ化しようとしているクライアント プログラムがあります。C# と C++ の 2 つを作成しました。VS2010 からクライアント プログラム (いずれか) を Ctrl-F5 (昇格モードで開始) で開始すると、クライアントは COM サーバーをアクティブ化できません。「クラスが登録されていません」というエラーが表示されます。コマンド ライン/Windows エクスプローラーからクライアントを起動すると、クライアントは正常にアクティブな COM サーバーを実行します。

したがって、ある場合には動作し(COMサーバーをアクティブにする)、別の場合には動作しない(COMサーバーをアクティブにしない)exeモジュールが1つあります。後者のケースは、モジュールが VS2010 から実行された場合です (デバッグではなく、Ctrl-F5 だけで)。

これは、vs2010で起動したモジュールがその権限を継承するため、権限に問題があると思われます。

processprivileges.codeplex.com の助けを借りて、私は 2 つの特権セットを取得します: それが機能しない場合: IncreaseQuota => 無効な
セキュリティ => 無効
な TakeOwnership => 無効
な LoadDriver => 無効な
SystemProfile => 無効な
SystemTime => 無効
な ProfileSingleProcess = > 無効な
IncreaseBasePriority => 無効
な CreatePageFile => 無効な
バックアップ => 無効な
復元 => 無効な
シャットダウン => 無効な
デバッグ => 有効
な SystemEnvironment => 無効
な ChangeNotify => 有効
な RemoteShutdown =>無効
Undock => 無効
ManageVolume => 無効
Impersonate => 有効
CreateGlobal => 有効
IncreaseWorkingSet => 無効
TimeZone => 無効
CreateSymbolicLink => 無効

これが機能する場合: シャットダウン => 無効
ChangeNotify => 有効
Undock => 無効
IncreaseWorkingSet => 無効
TimeZone => 無効

COM アクティベーションに関連する疑わしい特権は見当たりません。しかし、それ以外の理由は見当たりません。

あるケースではアウトプロセス COM サーバーが正常にアクティブ化され、別のケースではアクティブ化されないのはなぜですか?

4

1 に答える 1

1

「クラスが登録されていません」はレジストリの問題です。64ビットバージョンのWindowsでのプラットフォームターゲット設定に注意してください。SysInternalsのProcMonを使用して、レジストリキーの検索で問題が発生する理由を確認します。比較できる「良い」トレースと「悪い」トレースがあるので、データの山を掘り下げるのに役立ちます。CLSIDレジストリキーは重要なものです。

于 2011-04-17T19:50:09.930 に答える