[英]Cannot Derefrence IntPtr in C#
我編寫了一個在COM中實現IGroupPolicyObject接口的類。 現在,方法之一返回C#中的IntPtr對象:
IntPtr ghKey = objectGPolicy.GetRegistryKey(GpoSectionMachine);
使用屬於Microsot.Win32命名空間的RegistryKey對象時,我想取消引用該指針。
這不起作用:
(RegistryKey)ghKey = rootKey.CreateSubKey(policyPath);
我找不到如何取消對IntPtr的引用。 有人可以幫忙嗎?
謝謝
IGroupPolicyObject.GetRegistryKey
不返回.NET RegistryKey
對象,它返回Win32注冊表項句柄( HKEY
)。 您可以使用包含本地HKEY的IntPtr
值執行兩項有用的操作。 首先,您可以將其傳遞給其他Win32 注冊表訪問函數 。 如果以這種方式使用它,則還需要在完成后通過調用RegCloseKey
手動將其關閉,否則它將泄漏該句柄。
正如@HansPassant在其評論中有幫助地指出的那樣,您的第二個(可能更好)的選擇是將其轉換為SafeRegistryHandle
並使用它來獲取RegistryKey
對象:
var hkey = gpo.GetRegistryKey(GpoSectionMachine);
var safeHandle = new SafeRegistryHandle(hkey, true);
var reg = RegistryKey.FromHandle(safeHandle);
如果您編寫了IGroupPolicyObject
的托管實現 ,並且從此函數返回了實際的RegistryKey
對象,則:
IGroupPolicyObject
任何其他使用IGroupPolicyObject
,並且 RegistryKey
對象編組為 IntPtr
,所以只需做相反的操作即可將其撤回。 (但實際上-不要這樣做,您通過返回錯誤的類型來破壞COM合同。) 相反,應編寫此方法的實現以返回SafeRegistryHandle
(封送SafeRegistryHandle
將在SafeHandle
和非托管句柄之間自動轉換)。 RegistryKey.Handle
是其中之一,因此您可以直接使用C#類,直到需要從實現中返回某些內容為止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.