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
オブジェクトを返す場合:
IGroupPolicyObject
あなたはそれを間違っており、あなたの実装は の他の消費者に移植できません。
RegistryKey
オブジェクトを実装のに手動でマーシャリングしている必要がIntPtr
あるため、逆の操作を行って元に戻します。(しかし、実際には、そうしないでください。間違った型を返すことで、COM 契約を破っています。)
代わりに、このメソッドの実装は、 を返すように記述する必要がありますSafeRegistryHandle
(マーシャラーは、 とSafeHandle
アンマネージ ハンドルの間で自動的に変換すると思います)。RegistryKey.Handle
はこれらの 1 つであるため、実装から何かを返す必要があるまで C# クラスを使用できます。