2015-03-05 4 views
1

Я отлаживаю пользовательский exe во время компиляции моего кода с помощью задачи execbuilder msbuild.CreateFileA возвращает ошибку 20, «Система не может найти указанное устройство» с перерывами

Он работает следующий код:

HANDLE hFile = CreateFileA(szFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 
if (hFile == INVALID_HANDLE_VALUE) 
    Fatal(szFile, 1, "unable to open file (%x)", GetLastError()); 

szFile является DLL/EXE, который был составлен MSBuild, который передается программе в качестве аргумента.

Я иногда видеть следующее сообщение об ошибке:

unable to open file (20) 

После восстановления ошибка не повторится. Согласно кодам окон код ошибки 20 равен:

ERROR_BAD_UNIT20 (0x14) 

The system cannot find the device specified. 

Я не уверен, что это значит. Кажется, что этот файл не существует, потому что он это делает. Если бы код ошибки не был «2», я попытался. Вы знаете, что может вызвать эту ошибку? Благодарю.

Пара вещей:

const char *szFile = nullptr; 
... 
szFile = argv[i]; // it loops over the arguments, parses them and finds the right argment for the file. 
.... 
SetFileAttributes(szFile, FILE_ATTRIBUTE_NORMAL); 
HANDLE hFile = CreateFileA(szFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 
if (hFile == INVALID_HANDLE_VALUE) 
    Fatal(szFile, 1, "unable to open file (%x)", GetLastError()); 

Fatal() просто делает Printf имени файла и сообщения.

+0

Проверьте правильность значения переменной szFile. Не забывайте избегать символов «\». –

+3

@ Kostia: Экранирование символов '\\' требуется только при использовании символов string/character ** **. Во время выполнения переменная, указывающая на строку, интерпретируется как есть. Не требуется экранирование. – IInspectable

+0

По-прежнему проверьте правильность значения szFile. – immibis

ответ

2

Вы печатаете код ошибки в шестнадцатеричном формате (%x), а не в десятичном формате.

Код ошибки 0x20 (32 десятичный знак) - ERROR_SHARING_VIOLATION («Процесс не может получить доступ к файлу, потому что он используется другим процессом».) Итак, да, ваше предположение о другом процессе с открытым файлом было правильным.

В этих обстоятельствах я подозреваю состояние гонки, возможно, затронутое вирусом. Подумайте о том, чтобы ваш код обнаружил эту конкретную ошибку и повторил попытку после короткого ожидания.

+0

Спасибо, есть ли хороший способ определить, что этот процесс вызывает это, либо на C++, либо извне? – user2460953

+0

@user: Raymond Chen имеет запись в блоге об этом: [Как узнать, в каком процессе открыт файл?] (Http://blogs.msdn.com/b/oldnewthing/archive/2012/02/17/ 10268840.aspx) – IInspectable

+1

В этой ситуации (если вы просто хотите выяснить, что происходит в вашей среде разработки, а не помещать механизм в свой код для конечных пользователей), проще было бы использовать Process Monitor. (Доступно для загрузки с веб-сайта MS.) –