繁体   English   中英

HANDLE(IntPtr)已过时,kernel32.dll,SafeFileHandle转换为IntPtr

[英]HANDLE (IntPtr) Obsolete, kernel32.dll, SafeFileHandle to IntPtr

我需要执行非常相似的一个发现了一个解决方案在这里 ,写在2009年,检索文件的唯一标识符。 具体来说,我正在查看答案的ApproachB()函数和以下行(将其重写一下以反映新的C#功能):

var fi = new FileInfo(@"C:\Temp\testfile.txt");
var fs = fi.Open(FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
WinAPI.GetFileInformationByHandle(fs.Handle, out objectFileInfo); // fs.Handle being the portion in question

这里的问题是GetFileInformationByHandle映射到从“ kernel32.dll”导入的extern函数。 其签名如下:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);

类型IntPtr可以很好地映射到上面链接的文档HANDLE的指定类型。 但是, FileStream对象的Handle属性已被弃用( 作废 ),并替换为SafeFileHandle ,后者没有映射到IntPtr

有没有一种方法可以解决这个问题,使得extern定义可以接受SafeFileHandle类型? 还是为此目的实施了另一种extern方法?

将您的PInvoke签名更改为

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetFileInformationByHandle(SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);

或保留它并在您的SafeFileHandle实例上调用.DangerousGetHandle()方法,该方法将返回您要搜索的IntPtr。 该方法在为此目的而创建的基类SafeHandle中实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM