2013-06-29 40 views
0

我想枚舉MFT以獲取文件名列表。在一個Win32項目中使用時DeviceIoControl在C++和C#中工作,但在C++/CLI中調用時返回ERROR_INVALID_FUNCTION

此代碼:

MFT_ENUM_DATA med; 
med.StartFileReferenceNumber = 0; 
med.LowUsn = 0; 
med.HighUsn = ujd.NextUsn; 
BYTE pData[sizeof(DWORDLONG) + 0x10000]; 
DWORD cb; 
while (DeviceIoControl(handleToVolume, FSCTL_ENUM_USN_DATA, &med, sizeof(med), 
    pData, sizeof(pData), &cb, NULL) != FALSE) { 
//do the processing 
} 

但是,當我在C++/CLI中使用相同的代碼,DeviceIoControl提供虛假和GetLastError給ERROR_INVALID_FUNCTION。 當相同的代碼被轉換成C#時,它可以工作。

任何想法發生了什麼?

+0

你應該在託管代碼提防GetLastError'的'。你應該把正確的標誌放在你的DllImport屬性中,而不是使用'Marshal :: GetLastWin32Error'。另外,即使它不應該有影響,你應該在'cb'之前初始化爲'0'呼叫。 – Medinoc

+0

我正在使用非託管'DeviceIoControl'。我也嘗試過'Marshal :: GetLastWin32Error',它給出了與GetLastError相同的值1。還初始化'cb',但沒有好處。 我現在想知道這是否是由一些項目設置或屬性造成的... –

回答

0

檢查,如果你有這樣的定義:

#define FSCTL_ENUM_USN_DATA 
CTL_CODE(FILE_DEVICE_FILE_SYSTEM,44,METHOD_NEITHER,FILE_READ_DATA) 

和替換FILE_READ_DATAFILE_ANY_ACCESS

相關問題