Чтение указанного пользователем файла с помощью Win32 API - PullRequest
1 голос
/ 14 декабря 2011

Я пытаюсь предложить пользователю ввести имя файла / путь на консоли, а затем пытаюсь открыть этот файл с помощью CreateFile (). На данный момент вызов CreateFile () работает, если я использую жестко закодированное имя файла и макрос TEXT (). Однако после его ввода пользовательским вводом вызов завершается неудачно, и GetLastError () возвращает ошибку 123 или «Неверный синтаксис имени файла, имени каталога или метки тома». Ниже приведен соответствующий код, я довольно растерялся относительно того, почему это происходит.

LPTSTR dllPath;
LPDWORD dllPathLength;
dllPath = (LPTSTR)calloc(MAX_PATH, sizeof(TCHAR));
dllPathLength = new DWORD;
if(ReadConsole(hStdIn, dllPath, MAX_PATH, dllPathLength, NULL)==0)
{
    _tprintf(TEXT("ReadConsole failed with error %d\n"), GetLastError());
    return 1;
}


_tprintf(TEXT("File path entered: %s\n"), dllPath);

hDll = CreateFile(dllPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);
if (hDll == INVALID_HANDLE_VALUE)
{
    _tprintf(TEXT("CreateFile failed with error %d\n"), GetLastError());
    return 1;
}

Для справки, чтобы заставить его работать с жестко заданным путем к файлу, я заменил параметр "dllPath" в вызове CreateFile () на "TEXT (" C: \ log.log ")".

Любая помощь будет высоко ценится! Заранее извиняюсь, если это явная ошибка, я все еще пытаюсь привыкнуть к программированию на языке C в стиле Windows, и никогда не был слишком хорош с обычным стилем.

1 Ответ

3 голосов
/ 14 декабря 2011

Попробуйте:

TCHAR dllPath[MAX_PATH+1] = {0}; 
DWORD dllPathLength = 0; 
if(!ReadConsole(hStdIn, dllPath, MAX_PATH, &dllPathLength, NULL)) 
{ 
    _tprintf(TEXT("ReadConsole failed with error %u\n"), GetLastError()); 
    return 1; 
} 

_tprintf(TEXT("File path entered: %s\n"), dllPath); 

hDll = CreateFile(dllPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL); 
if (hDll == INVALID_HANDLE_VALUE) 
{ 
    _tprintf(TEXT("CreateFile failed with error %u\n"), GetLastError()); 
    return 1; 
} 

Если это все еще не работает, то убедитесь, что ReadConsole() не включает разрыв строки или другой терминатор в конце возвращаемого пути, чтобы сделать его недействительным.Если это так, вам придется снять его, прежде чем звонить CreateFile().

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