Почему CreateFile возвращает неверный дескриптор? - PullRequest
0 голосов
/ 08 мая 2011

У меня есть CreateFile() для создания скрытого типа файла, но проблема в том, что он возвращает неверный дескриптор.

file = CreateFileW(_T("hey.txt"),
                   GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
                   0, 0);
error = GetLastError();
WriteFile(file, buff, sizeof(buff),
          &dwRet, NULL);

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 08 мая 2011

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

Правильная проверка ошибок для вашего кода должна быть чем-то вроде ...

file = CreateFile(_T("hey.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);

if (file == INVALID_HANDLE_VALUE)
{
   const DWORD error = GetLastError();

   // Do something!
}
else
{  
   if (!WriteFile(file, buff, sizeof(buff), &dwRet, NULL))
   {
      const DWORD error = GetLastError();

      // Do something!
   }
}

Вы должны проверять ошибку только в том случае, если вы получите возвращаемое значение INVALID_FILE_HANDLE, так как CreateFile() может не сбрасыватьсяпоследняя ошибка перед ее запуском, и поэтому вы можете получить ложные значения ошибок из GetLastError(), если функция завершится успешно ...

Последняя ошибка 6, ERROR_INVALID_HANDLE, необычна из CreateFile(), если только вы не 'Вы используете параметр файла шаблона, который вам не нужен ...

Ваш код, использующий CreateFileW и _T (""), неверен и не будет компилироваться в сборке, не поддерживающей Юникод.Лучше использовать CreateFile и _T ("") или CreateFileW и L "".

Ваш код не создаст скрытый файл, см. Ответ molbdnilo.

3 голосов
/ 08 мая 2011

0 не является допустимым параметром для dwFlagsAndAttributes. Чтобы создать скрытый файл, передайте FILE_ATTRIBUTE_HIDDEN.

0 голосов
/ 17 августа 2011

Если «C: \ test.txt» существует и скрыто, то следующий код завершится ошибкой (h = INVALID_HANDLE_VALUE):

h = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);

это тоже не получается (аргумент 6 == FILE_ATTRIBUTES_NORMAL или аргумент6 == 0, кажется, тоже самое):

h = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

но это работает:

h = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, 0);

Так примерно другими словами: если файл уже существует и скрыт, то CreateFile с «CREATE_ALWAYS» завершится неудачно, если аргумент 6! = FILE_ATTRIBUTE_HIDDEN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...