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#時,它可以工作。
任何想法發生了什麼?
你應該在託管代碼提防GetLastError'的'。你應該把正確的標誌放在你的DllImport屬性中,而不是使用'Marshal :: GetLastWin32Error'。另外,即使它不應該有影響,你應該在'cb'之前初始化爲'0'呼叫。 – Medinoc
我正在使用非託管'DeviceIoControl'。我也嘗試過'Marshal :: GetLastWin32Error',它給出了與GetLastError相同的值1。還初始化'cb',但沒有好處。 我現在想知道這是否是由一些項目設置或屬性造成的... –