5

COM相互運用機能オブジェクトをインスタンス化する場合:

var comObj = new ComComponentClass();

私は:を取得しCOMExceptionます

Retrieving the COM class factory for component with CLSID 
{C343ED84-A129-11D3-B799-0060B0F159EF} failed due to the following error: 
80040154 Class not registered 
(Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

このエラーが発生するのは、[管理者として実行]を使用してアプリケーションを起動した場合のみです。正常に動作している場合、エラーは発生しません。

ノート:

  • アプリケーションは64ビットアプリケーションです。
  • COMコンポーネントは、64ビットdllのinprocサーバーです。

この違いが発生する理由をどこから調査し始めるべきかについてのアイデアはありますか?

私が試したこと:

Procmonを使用して、Procmonが検査するレジストリキーを監視しました。

  • どちらの場合も、キーを検査することで適切なdllが見つかりますHKCU\Software\Classes\CLSID\{C343ED84-A129-11d3-B799-0060B0F159EF}\InprocServer32
  • どちらの場合も、キーHKCR\CLSID\{C343ED84-A129-11D3-B799-0060B0F159EF}を照会して戻りNAME NOT FOUNDます。これは奇妙だと思います(使用してそのキーを見つけることができるためですregedit.exe。しかし、これは2つのシナリオ間で違いがないため、重要ではないようです。
4

1 に答える 1

4

管理プロセスからではなく、管理者権限なしでローカルユーザーアカウントのオブジェクトを登録しました。そのため、COMコンポーネントは、レジストリのユーザー固有の領域に登録されます(ご自身で指定したとおり:HKC * U *)。

プロセスが管理者権限なしで実行されると、HKCRレジストリのマージされたビューが表示されます。これには、すべてのHKCU \ Software \ Classesエントリに加えて、HKCU \ Software\ClassesでオーバーライドされていないHKLM\Software\Classesのすべてが含まれます。 。プロセスが管理者として実行される場合、レジストリにはHKLM \ Software\Classesエントリのみが表示されます。

詳細については、次のリンクを参照してください:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms724498 (v=vs.85).aspx

奇妙なことに、RegSvr32はHKCU\Classesキーの下に登録されません。管理者権限なしで実行すると、失敗します(Windows 7では、確認のためにチェックしただけです)。COMコンポーネントはどのように登録されましたか?

于 2013-03-25T18:53:03.013 に答える