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);

但是,该文件写入项目目录(即 Microsoft Visual Studio 解决方案文件所在的位置)而不是 C:\Projects\ 目录。

如何将 .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无效。

如果您有一个包含真正反斜杠的字符串,则需要将它们加倍:

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