【发布时间】:2013-06-29 01:59:09
【问题描述】:
我正在尝试枚举 MFT 以获取文件名列表。
此代码在 Win32 项目中使用时有效:
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 给出 false,GetLastError 给出 ERROR_INVALID_FUNCTION。
当相同的代码被翻译成 C# 时,它可以工作。
知道发生了什么吗?
【问题讨论】:
-
您应该注意托管代码中的
GetLastError。您应该在 DllImport 属性中放置正确的标志,并改用Marshal::GetLastWin32Error...此外,即使它不应该产生影响,您也应该在调用之前将cb初始化为零。 -
我正在使用非托管
DeviceIoControl。我也试过Marshal::GetLastWin32Error,它给出的值1与GetLastError相同。也初始化了cb,但是不行。我现在想知道这是否是由某些项目设置或属性引起的......