2016-04-12 22 views
0

Bir dosya için benzersiz bir tanımlayıcıyı almak üzere, 2009'da yazılmış olan here numaralı telefona çok benzeyen bir çözüm uygulamaya ihtiyacım var. Özellikle, ben cevabım ApproachB() fonksiyonu bakıyorum ve çizgi izleyen (yeni C# yetenekleri yansıtmak için biraz yeniden yazılmış):HANDLE (IntPtr) Eski, kernel32.dll, IntPtr için SafeFileHandle

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 

sorunu, burada, bir extern işlevine GetFileInformationByHandle haritalar ithal olmasıdır "kernel32.dll". şöyle imzası:

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

Tipi yukarıda bağlantılı doc.s HANDLE belirtilen tipe de IntPtr haritalar. Ancak, FileStream nesnesindeki Handle özelliğinin kullanımdan kaldırılmış (obsolete olarak yapılmış) ve IntPtr eşlemesiyle eşleştirilmediği SafeFileHandle ile değiştirilmiştir.

extern tanım türünü SafeFileHandle kabul nerede bu üstesinden gelmek için bir yol var mı? Veya, bu amaçla uygulanan başka bir extern yöntemi var mı?

cevap

2

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

için PInvoke imza değiştirin veya tutmak ve SafeFileHandle Örneğin aradığınız IntPtr dönecektir yöntem .DangerousGetHandle() çağrısında

. Bu yöntem tam olarak bu amaçla yapılmış olan SafeHandle taban sınıfında uygulanmaktadır.

İlgili konular