已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
2天前关闭。
Improve this question
这是我做的一个打开BMP图片的程序。当我需要打开一个新文件时,我需要清空上次加载的内存,但总是失败。我不知道哪里出错了。
static BYTE *data;
HDC memDC, winDC;
HBITMAP hBit;
HANDLE hFile;
if (data != NULL) {
DeleteObject(hBit);
ReleaseDC(hWnd, memDC); // faild,Invalid DC
DWORD dwError = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, dwError, 0, szBuffer, 255, NULL);
// DeleteDC(memDC);
DeleteObject(memDC);
\\Although the return value indicates success,
the data memory cannot be released and an exception will be generated
DWORD dd = GetLastError();
ReleaseDC(hWnd, winDC);
dd = GetLastError();
int ss = ReleaseDC(hWnd, memDC);
free(data); //产生异常
}
szFile = OpenBmp(hWnd);
if (szFile != NULL) {
wcscpy_s(fName, lstrlen(szFile) * 2, szFile);
} else
return NULL;
hFile = CreateFile(fName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
R = ReadFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &num, NULL);
if (R) {
R = ReadFile(hFile, &fif, sizeof(BITMAPINFOHEADER), &num, NULL);
winDC = GetDC(hWnd);
memDC = CreateCompatibleDC(winDC);
GetClientRect(hWnd, &rect);
dataSize = bfh.bfSize - bfh.bfOffBits;
data = (BYTE *)malloc(dataSize);
pbmi.bmiHeader = fif;
width = fif.biWidth;
height = fif.biHeight;
hBit =
CreateDIBSection(memDC, &pbmi, DIB_RGB_COLORS, (void **)&data, NULL, 0);
R = ReadFile(hFile, data, dataSize, &num, NULL);
SelectObject(memDC, hBit);
open = TRUE;
InvalidateRect(hWnd, &rect, TRUE);
}
CloseHandle(hFile);
这是我做的一个打开BMP图片的程序。当我需要打开一个新文件时,我需要清空上次加载的内存,但总是失败。我不知道哪里出错了。
1条答案
按热度按时间nzk0hqpo1#
ReleaseDC(hWnd, memDC)
失败是因为您最初不是从hWnd
获得memDC
,而是从CreateCompatibleDC()
获得的,因此您需要将memDC
传递给DeleteDC()
(而不是DeleteObject()
)。您从
hWnd
获得了winDC
,因此winDC
是您需要传递给ReleaseDC()
的DC。此外,您将
hBit
选择到memDC
中,但在将它们都删除之前不能取消选择hBit
。此外,您还在泄漏内存,因为
CreateDIBSection()
用它自己的内存指针覆盖了您的data
指针,从而丢失了malloc
内存的地址。当hSection
参数为NULL时,您不能使用CreateDIBSection()
的预分配内存。除此之外,GDI函数不使用
GetLastError()
来报告错误,并且您错误地使用了wcscpy_s()
。试试这样的方法: