0

以下を使用して、ファイルへのハンドルを取得しました。

char *filePathAndName = "C:\Projects\pic.bmp";
HANDLE hFile = CreateFile(_T(filePathAndName),GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

そして、私は以下を使用してファイルを書きました:

WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &dwBytesWritten, NULL);

ただし、ファイルは、C:\Projects\ ディレクトリではなく、プロジェクト ディレクトリ (つまり、Microsoft Visual Studio ソリューション ファイルが存在する場所) に書き込まれます。

指定したディレクトリに .bmp ファイルを書き込むにはどうすればよいですか?

4

2 に答える 2

4

_T()マクロはリテラルでのみ使用できます (マクロと同じ) TEXT()。また、リテラルのスラッシュをエスケープしていません。

C ランタイムは_T()マクロを使用します。Win32 API はTEXT()マクロを使用します。効果的に同じことを行っていても、それらを混ぜてはいけません。使用している API に適したマクロを使用してください。

LPSTRまた、 を呼び出すときにデータを型キャストする必要はありませんWriteFile()

代わりにこれを使用してください:

LPTSTR filePathAndName = TEXT("C:\\Projects\\pic.bmp");
HANDLE hFile = CreateFile(filePathAndName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
...
WriteFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, &bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, lpbitmap, dwBmpSize, &dwBytesWritten, NULL);

そうは言っても、通常は、またはのいずれかを使用して、ユーザーに出力ファイル名を要求する必要がありGetSaveFileName()ますIFileSaveDialog。または、独自のファイル名を使用する場合は、少なくともSHBrowseForFolder()(またはフォルダーの選択もサポートするIFileSaveDialog ) を使用して宛先フォルダーを要求します。

于 2014-11-13T03:02:13.097 に答える
3

これはあなたの問題です:

char *filePathAndName = "C:\Projects\pic.bmp";

文字列または文字リテラルのバックスラッシュは、特殊文字を示します。たとえば、\tタブまたは\n改行の場合です。コンパイラは不平を言うべきであり、有効ではありません\P\p

実際のバックスラッシュを含む文字列がある場合は、それらを 2 倍にする必要があります。

char *filePathAndName = "C:\\Projects\\pic.bmp";
于 2014-11-13T02:31:15.883 に答える