2

COM オブジェクトのインスタンスを作成しようとしています。インターフェイスを実装するクラス名があり、CLSIDFromProgID() を使用して CLSID を取得します。だから私はCLSIDを取得しているので、これからはすべてがうまくいくはずだと思っていました. ただし、CreateInstance を呼び出して CLSID を渡すと、「クラスが登録されていません」というエラーが表示されます。また、一部のコンピューターでのみこのエラーが発生します。複数のコンピューターでエラーなしで実行されます。問題がどこにあるのかわかりません。レジストリが汚れていますか? ここで何が起こっているか知っている人はいますか?ご協力いただきありがとうございます!

これが .NET COM クラスであることを付け加えたいと思います。適切なエントリはレジストリにあり、DLL は GAC にあります。

4

4 に答える 4

2

CLSIDFromProgId は、レジストリで ProgId の名前を検索して CLSID に変換するだけです。レジストリ以外のものを調べたり、何かが実際にその CLSID を実装していることを確認したりする必要はありません。

CLSID で CreateInstance を呼び出すと、Windows はレジストリを調べて、オブジェクト (通常は exe または dll) をインスタンス化する方法を見つけます。次に、dll をロード (または exe を起動) し、そこからオブジェクトを作成しようとします。

関連するプロセスについては、MSDN に多くのドキュメントがあります。たとえば、「COM クラス オブジェクトと CLSID」を参照してください。多くの COM 作業を行う場合は、多くの時間を節約できるため、最初のプリンシパルからプロセスを学ぶ価値があります。このタイプの問題をデバッグするときの面倒。

于 2008-11-03T21:32:10.193 に答える
1

これは、レジストリでの 2 段階のプロセスです。ProgID を使用して CLSID を取得しました。次に、CreateInstance を呼び出すと、COM は CLSID を使用して dll へのパスを見つけます。自分で regedit を使用して CLSID を検索し、そのエントリがどのように見えるかを確認できます。

于 2008-11-03T21:31:22.537 に答える
1

回答ありがとうございます。.Net アセンブリは適切に登録され、GAC に存在していました。これを完全に確認したアプリケーションの 1 つが Process Explorer です。各アプリケーションによってロードされる dll を表示できます。したがって、ここから、COM オブジェクトをインスタンス化するアプリケーションが実際に DLL をロードできるかどうかを確認できました。これが実際に起こっていることがわかりました。この問題は、異なる地域設定が原因でした。地域が米国に設定されていない場合、アプリケーションが例外をスローしたことがわかりました。この問題は修正されました。「クラスが登録されていません」というエラー メッセージはあまり役に立ちませんでした。ありがたいことに、それは迅速な修正でした。

于 2008-11-05T19:55:54.880 に答える
0

例としてshell32を使用すると、次のような新しいインスタンスを作成できます。

var shl = (Shell) Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));

これにより、既存のコンポーネントへの参照が取得されます。

var shl2 = (Shell) Marshal.GetActiveObject("Shell.Application");

これは、 IronPythonで同じことを行う方法へのリファレンスです。

**これはprogidを使用していることに注意してください。clsidはほぼ同じで、Type.GetTypeFromCLSID({GUID})を使用するだけです。

于 2009-11-16T14:18:55.167 に答える