2013-06-29 1 views
0

파일 이름 목록을 가져 오기 위해 MFT를 열거하려고합니다.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은 false 제공하고 GetLastError이 ERROR_INVALID_FUNCTION을 제공 :는 Win32 프로젝트에 사용하는 경우

이 코드는 작동합니다. 동일한 코드가 C#으로 변환되면 작동합니다.

어떤 아이디어가 있습니까? 이 정의가있는 경우

+0

FILE_READ_DATA

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

및 대체 당신은 관리 코드에 GetLastError''조심해야한다. 당신은 당신의 DllImport 속성에 올바른 플래그를 넣고'Marshal :: GetLastWin32Error'를 대신 사용해야합니다 ... 또한 영향력을 가지지는 않겠지 만, 당신은 영향을주기 전에'cb'를 0으로 초기화해야합니다. 요구. – Medinoc

+0

관리되지 않는'DeviceIoControl'을 사용하고 있습니다. 'Marshal :: GetLastWin32Error'도 시도해 보았고 GetLastError와 같은 값 1을줍니다. 또한'cb'를 초기화했지만 좋지는 않습니다. 이것이 어떤 프로젝트 설정이나 속성 때문에 발생하는지 궁금합니다 ... –

답변

관련 문제