簡體   English   中英

無法在C#中反引用IntPtr

[英]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對象,則:

  1. 您做錯了,您的實現無法移植到IGroupPolicyObject任何其他使用IGroupPolicyObject ,並且
  2. 您必須在實現中手動將RegistryKey對象編組 IntPtr ,所以只需做相反的操作即可將其撤回。 (但實際上-不要這樣做,您通過返回錯誤的類型來破壞COM合同。)

相反,應編寫此方法的實現以返回SafeRegistryHandle (封送SafeRegistryHandle將在SafeHandle和非托管句柄之間自動轉換)。 RegistryKey.Handle是其中之一,因此您可以直接使用C#類,直到需要從實現中返回某些內容為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM