0

COM の問題を追跡しようとして、コードをデバッグしていて、同じ GUID が異なる方法で表されているように見えます...

コードに次の行があります。 class __declspec(uuid("{D4F83347-E58E-11d1-9D47-006008098294}"))

その間にさまざまなレジストリがあり、次の呼び出しがあります。

CLSID clsid;
::CLSIDFromProgID("myProgId",&clsid);

デバッガーでは、clsid は として表示され{000AFC9A-3347-D4F8-8EE5-D1119D470060}ます。私にはこれはあまりにも似ていて正しくありませんが、自動的に確認できるものではありません... D4F8 と 3347、9D47 がありますが、E58E は 8EE5 になります。

なぜこれが起こっているのかを理解する方法と、比較のために同じように見せる方法はありますか?

EDIT いくつかのサイドトラッキングをクリアするために、WindowsレジストリのCLSIDと登録スクリプトも確認しました{D4F83347-E58E-11d1-9D47-006008098294}-したがって、私の問題uuid(...)は関係ないと思います.

4

3 に答える 3

1

すでにGUIDがある場合にCLSIDFromProgID()を使用しても、あまり意味がありません。この関数はレジストリを調べて、「ProgId」文字列をCLSID{guid}にマップします。もちろん、progidが正しく登録されていることが重要になります。確かにそうではないように聞こえます。クラスがすでにで装飾されている__declspec(uuid)場合は、__ uuidof()演算子を使用してGUIDを取得します。

バイト値の類似性は、登録コードが壊れていることを示しています。

于 2012-11-16T13:05:47.850 に答える
1

「__declspec(uuid」は、クラスへの識別子の関連付けにすぎませんCLSIDFromProgID。API を使用すると、システム レジストリの登録情報を使用して ProgID を CLSID に解決できます。つまり、2 つが一致する必要はありません。通常は一致します。ただし、すべてをきちんと行い、COM クラスが、ソース コードで C++ クラスに関連付けられている識別子と同じ識別子で登録されている場合。

于 2012-11-16T13:08:36.737 に答える
0

いくつかのテストの結果、問題は単にVisualC++デバッガーが値を表示する方法にあるだけであることがわかりました。たとえば、レジ​​ストリ値は、 givesの結果を{D4F83347-E58E-11d1-9D47-006008098294}呼び出す-ですが、デバッガーではMSVC++は変数を。として表示します。::StringToCLSID()CLSIDFromProgID(){D4F83347-E58E-11d1-9D47-006008098294}{000AFC9A-3347-D4F8-8EE5-D1119D470060}

なぜそうなるのか、別の質問です!

于 2012-11-16T16:48:44.230 に答える