使用Win32 API读取用户指定的文件

时间:2011-12-14 01:23:47

标签: c++ c winapi

我正在尝试提示用户在控制台输入文件名/路径,然后尝试使用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编程,并且对常规风格也不是很好。

1 个答案:

答案 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()之前将其剥离。