簡體   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