ユーザーにコンソールでファイル名/パスの入力を求め、CreateFile()を使用してこのファイルを開こうとしています。現時点では、ハードコードされたファイル名とTEXT()マクロを使用すると、CreateFile()の呼び出しが機能します。ただし、ユーザー入力を渡すと、呼び出しは失敗し、GetLastError()はエラー123または "ファイル名、ディレクトリ名、またはボリュームラベル構文が正しくありません"を返します。以下は関連するコードですが、なぜこれが起こっているのか分かりません。それはハードコードされたファイルパスを動作させるために参考のためにWin32 APIを使用してユーザー指定のファイルを読み取る
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;
}
は、私はとのCreateFile()を呼び出し、「TEXT(」:\ log.log C「)」の「たDllPath」パラメータを置き換えます。
ご協力いただければ幸いです。私はまだWindowsスタイルのCプログラミングに慣れようとしていますし、普通のスタイルでもそれほど良いことはありませんでした。
ところで、TCHARマクロや友人を使う理由はまったくありません。Win95は長年にわたり、現在サポートされているWin32 OSはすべてUNICODEです。代わりにWCHAR/wprintf/LPWSTR/L ""を直接使うことができます。また、dllPathLengthの場合、このためにメモリを割り当てる必要はありません。DWORD変数を直接使用するだけです: 'DWORD dwDllPathLength = 0;を宣言し、'&dwDllPathLength'をパラメータとして渡します。 – BrendanMcK