我正在尝试提示用户在控制台输入文件名/路径,然后尝试使用CreateFile()打开此文件。目前,如果我使用硬编码文件名和TEXT()宏,则调用CreateFile()。但是,在传递用户输入时,调用失败并且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;
}
作为参考,为了使它与硬编码文件路径一起使用,我用“TEXT(”C:\ log.log“)”替换了对CreateFile()的调用中的“dllPath”参数。
任何帮助将不胜感激!如果这是一个明显的错误,请提前道歉,我仍然习惯于习惯于Windows风格的C编程,并且对常规风格也不是很好。
答案 0 :(得分:3)
试试这个:
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()
之前将其剥离。