0

COM で IGroupPolicyObject インターフェイスを実装するクラスを作成しました。メソッドの 1 つは、C# で IntPtr オブジェクトを返すようになりました。

IntPtr ghKey = objectGPolicy.GetRegistryKey(GpoSectionMachine);

Microsot.Win32 名前空間に属する RegistryKey オブジェクトを使用するときに、そのポインターを逆参照したいと考えています。

これは機能しません:

(RegistryKey)ghKey = rootKey.CreateSubKey(policyPath);

IntPtr を逆参照する方法が見つかりません。誰か助けてくれませんか?

ありがとう

4

1 に答える 1

6

IGroupPolicyObject.GetRegistryKeyは .NETRegistryKeyオブジェクトを返さず、Win32 レジストリ キー ハンドル ( HKEY) を返します。IntPtrネイティブ HKEY を含む値を使用して実行できる便利なことが 2 つあります。まず、他の Win32レジストリ アクセス関数に渡すことができます。このように使用する場合は、終了時に呼び出して手動で閉じる必要もありRegCloseKeyます。そうしないと、ハンドルがリークします。

@HansPassant が彼のコメントで有益に指摘しているように、2 番目の (そしておそらくより良い) オプションは、それを に変換し、SafeRegistryHandleそれを使用してRegistryKeyオブジェクトを取得することです。

var hkey = gpo.GetRegistryKey(GpoSectionMachine);
var safeHandle = new SafeRegistryHandle(hkey, true);
var reg = RegistryKey.FromHandle(safeHandle);

のマネージ実装を作成し、この関数からIGroupPolicyObject実際のRegistryKeyオブジェクトを返す場合:

  1. IGroupPolicyObjectあなたはそれを間違っており、あなたの実装は の他の消費者に移植できません。
  2. RegistryKeyオブジェクト実装のに手動でマーシャリングしている必要がIntPtrあるため、逆の操作を行って元に戻します。(しかし、実際には、そうしないでください。間違った型を返すことで、COM 契約を破っています。)

代わりに、このメソッドの実装は、 を返すように記述する必要がありますSafeRegistryHandle(マーシャラーは、 とSafeHandleアンマネージ ハンドルの間で自動的に変換すると思います)。RegistryKey.Handleはこれらの 1 つであるため、実装から何かを返す必要があるまで C# クラスを使用できます。

于 2012-06-15T01:47:31.870 に答える