[英]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.