2009年1月15日 星期四

How to pass the RegisterKey to RegOverridePredefKey function

說明:
RegisterKey 是一個 .NET managed物件,RegOverridePredefKey 是一個原生Win32的函式呼叫,該函數主要用途在允許將一個預定義的註冊表項映射到另一個註冊表項。RegOverridePredefKey 的使用時機請連結參考網址。本文主旨在說明如何不使用原生自訂的Win32的函式庫而使用.NET managed達到如參考網址相同功能。

RegOverridePredefKey 原始宣告:
LONG RegOverridePredefKey(HKEY hKey, HKEY hNewHKey);

RegOverridePredefKey .NET P/Invoke 宣告:
[DllImport("advapi32.dll")]
public static extern long RegOverridePredefKey(IntPtr key, IntPtr newKey);

解決方法:
定義一個轉換方法 ;fieldInfo.GetValue 在 .NET 2.0 無法直接轉型成 IntPtr,其在取得 hkey 屬性時的型別為 Microsoft.Win32.SafeHandles.RegistrySafeHandle,繼承自System.Runtime.InteropServices.SafeHandle。
public static IntPtr GetRegistryHandle(RegistryKey registryKey)
{
Type type = registryKey.GetType();
FieldInfo fieldInfo = type.GetField("hkey", BindingFlags.Instance BindingFlags.NonPublic);
return ((SafeHandle)fieldInfo.GetValue(registryKey)).DangerousGetHandle();
}

附註:
RegOverridePredefKey 的使用時機之一是在OpenFileDialog自定義左邊PlacesBar,在.NET 2.0 sp1之後,OpenFileDialog已支援 CustomPlaces的集合屬性。

參考網址:http://msdn.microsoft.com/zh-cn/library/aa663661.aspx

沒有留言: