2012-06-15 93 views
0

我寫了一個在COM中實現IGroupPolicyObject接口的類。該方法的一個 現在返回在C#IntPtr的對象:C#中無法解析IntPtr#

IntPtr ghKey = objectGPolicy.GetRegistryKey(GpoSectionMachine); 

欲使用屬於Microsot.Win32命名空間中的RegistryKey對象時derefrence該指針。

這不起作用:

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

我找不到如何derefrence一個IntPtr。有人可以幫忙嗎?

感謝

+1

使用RegistryKey.FromHandle() –

+0

呵呵;我甚至在我回答之前尋找這種方法,因爲我確信有一個,但沒有看到它。 THPT。來自GetRegistryKey函數的 –

回答

6

IGroupPolicyObject.GetRegistryKey沒有返回.NET RegistryKey對象,它返回一個Win32註冊表項句柄(一個HKEY)。使用包含本地HKEY的IntPtr值可以做兩件有用的事情。首先,您可以將它傳遞給其他Win32 registry access functions。如果以這種方式使用它,則還需要在完成後通過撥打RegCloseKey手動關閉它,否則會泄漏手柄。

由於@HansPassant有益在他的評論中指出的那樣,你的第二個(可能更好)的選擇是把它變成一個SafeRegistryHandle,並用它來獲得一個RegistryKey對象:

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

如果你寫了一個管理的IGroupPolicyObject實施並從該函數,然後返回實際RegistryKey對象:

  1. 你們這樣做是錯誤的,你的代碼是不可移植的的IGroupPolicyObject Y以外的消費,並
  2. 您必須手動整理您的RegistryKey對象到您的實現IntPtr,所以只是做相反把它找回來了。 (不過說真的 - 不這樣做,你是打破了由返回錯誤類型的COM合同。)

這種方法的實現應改爲寫入返回SafeRegistryHandle(封送拆會,我相信,在SafeHandle和非託管手柄之間自動轉換)。 RegistryKey.Handle就是其中之一,所以你可以直接使用C#類,直到你需要從你的實現中返回一些東西。

+0

函數我的託管實現返回IntPtr值。你能舉一個例子,我怎樣才能使用IntPtr與C#中的註冊表訪問功能?謝謝 –

+0

Win32註冊表訪問函數全部採用一個HKEY值,將其作爲IntPtr轉換爲C#。假設你的GetRegistryKey函數將一個有效的HKEY作爲一個IntPtr返回,你只需將該值直接返回給RegQueryValueEx。 –

+0

但RegQueryValueEx是C++而不是C#。這就是我想要C#的全部觀點。 –