gpt4 book ai didi

c# - 如何将 IntPtr 转换为 UIntPtr?

转载 作者:太空狗 更新时间:2023-10-29 23:41:07 28 4
gpt4 key购买 nike

我试过这样转换它:

UIntPtr x = (UIntPtr)intPtr;

...但是编译器对此不太满意并返回编译错误。

我需要进行转换,因为 RegOpenKeyEx 的 P/Invoke 签名需要一个 UIntPtr:

  [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(
UIntPtr hKey,
string subKey,
int ulOptions,
int samDesired,
out UIntPtr hkResult);

为了获得句柄,我使用了返回 IntPtr 的 SafeHandle.DangerousHandle():

   /// <summary>
/// Get a pointer to a registry key.
/// </summary>
/// <param name="registryKey">Registry key to obtain the pointer of.</param>
/// <returns>Pointer to the given registry key.</returns>
IntPtr _getRegistryKeyHandle(RegistryKey registryKey)
{
//Get the type of the RegistryKey
Type registryKeyType = typeof(RegistryKey);

//Get the FieldInfo of the 'hkey' member of RegistryKey
System.Reflection.FieldInfo fieldInfo =
registryKeyType.GetField("hkey", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

//Get the handle held by hkey
SafeHandle handle = (SafeHandle)fieldInfo.GetValue(registryKey);

//Get the unsafe handle
IntPtr dangerousHandle = handle.DangerousGetHandle();
return dangerousHandle;
}

最佳答案

在查看 msdn 后,我注意到 UIntPtrIntPtr 都有 void* 指针转换。

IntPtr a = ....;
UIntPtr b = (UIntPtr)a.ToPointer();

此时你需要不安全的代码。避免这种情况的唯一方法是使用 unchecked 关键字并使用非指针类型进行转换(也使用 here)。

这两个指针之间没有转换的原因可能是像 IntPtr 这样的 UIntPtr 没有固定的大小,因为它们是平台特定的( see ) .

关于c# - 如何将 IntPtr 转换为 UIntPtr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8397092/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com