BOOL CCreateHTMLImage::CreateImage(LPCTSTR szSrcFilename, LPCTSTR szDestFilename, CSize srcSize, CSize outputSize)
{
USES_CONVERSION;
ASSERT(GetSafeHwnd());
ASSERT(IsWindow(GetSafeHwnd()));
ASSERT(szSrcFilename);
ASSERT(AfxIsValidString(szSrcFilename));
ASSERT(szDestFilename);
ASSERT(AfxIsValidString(szDestFilename));
CRect rect(CPoint(0, 0), srcSize);
// The WebBrowswer window size must be set to our srcSize
// else it won't render everything
MoveWindow(&rect);
m_pBrowserWnd.MoveWindow(&rect);
COleVariant vUrl(szSrcFilename, VT_BSTR),
vFlags(long(navNoHistory | navNoReadFromCache | navNoWriteToCache), VT_I4),
vNull(LPCTSTR(NULL), VT_BSTR);
COleSafeArray vPostData;
if (m_pBrowser->Navigate2(&vUrl, &vFlags, &vNull, &vPostData, &vNull) == S_OK)
// We have to pump messages to ensure the event handler (DocumentComplete)
// is called.
RunModalLoop();
else
return FALSE;
// We only get here when DocumentComplete has been called, which calls EndModalLoop
// and causes RunModalLoop to exit.
IHTMLDocument3* pDocument3 = NULL;
IHTMLDocument2* pDocument = NULL;
IHTMLElement2* pElement2 = NULL;
IHTMLElement* pElement = NULL;
IViewObject2* pViewObject = NULL;
IDispatch* pDispatch = NULL;
//IDispatch* pWebBrowserDisp = NULL;
HRESULT hr;
long bodyHeight;
long bodyWidth;
long rootHeight;
long rootWidth;
long height;
long width;
hr = m_pBrowser->get_Document(&pDispatch);
if (hr == S_OK) { // Need to release pDispatch
hr = pDispatch->QueryInterface(IID_IHTMLDocument2, (void**) &pDocument);
if (hr == S_OK) { // Need to release pDocument
hr = pDocument->get_body(&pElement);
if (hr == S_OK) { // Need to release pElement
hr = pElement->QueryInterface(IID_IHTMLElement2, (void**) &pElement2);
if (hr == S_OK) { // Need to release pElement2
hr = pElement2->get_scrollHeight(&bodyHeight);
if (FAILED(hr))
return true;
hr = pElement2->get_scrollWidth(&bodyWidth);
if (FAILED(hr))
return true;
pElement2->Release();
}
pElement->Release();
}
pDocument->Release();
}
hr = pDispatch->QueryInterface(IID_IHTMLDocument3, (void**) &pDocument3);
if (hr == S_OK) { // Need to release pDocument3
hr = pDocument3->get_documentElement(&pElement);
if (hr == S_OK) { // Need to release pElement
hr = pElement->QueryInterface(IID_IHTMLElement2, (void**) &pElement2);
if (hr == S_OK) { // Need to release pElement2
hr = pElement2->get_scrollHeight(&rootHeight);
if (FAILED(hr))
return true;
hr = pElement2->get_scrollWidth(&rootWidth);
if (FAILED(hr))
return true;
pElement2->Release();
}
pElement->Release();
}
pDocument3->Release();
}
width = bodyWidth;
height = rootHeight > bodyHeight ? rootHeight : bodyHeight;
MoveWindow(0, 0, width, height, TRUE);
::MoveWindow(m_pBrowserWnd.GetSafeHwnd(), 0, 0, width, height, TRUE);
hr = m_pBrowser->QueryInterface(IID_IViewObject2, (void**) &pViewObject);
if (hr == S_OK) { // Need to release pViewObject
BITMAPINFOHEADER bih;
BITMAPINFO bi;
RGBQUAD rgbquad;
ZeroMemory(&bih, sizeof(BITMAPINFOHEADER));
ZeroMemory(&rgbquad, sizeof(RGBQUAD));
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = width;
bih.biHeight = height;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biClrUsed = 0;
bih.biSizeImage = 0;
bih.biCompression = BI_RGB;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bi.bmiHeader = bih;
bi.bmiColors[0] = rgbquad;
CDC* dc = GetDC();
HDC hdcMain = *dc;
if (!hdcMain)
return true;
HDC hdcMem = CreateCompatibleDC(hdcMain);
if (!hdcMem)
return true;
char* bitmapData = NULL;
HBITMAP hBitmap = CreateDIBSection(hdcMain, &bi, DIB_RGB_COLORS, (void**)&bitmapData, NULL, 0);
if (!hBitmap) {
// TODO: cleanup
return true;
}
// Save original bitmap, note this is needed to be reselected to preven GDI resource leak // EL
HGDIOBJ oldHBitmap = GetCurrentObject(hdcMem, OBJ_BITMAP);
if(oldHBitmap == NULL) {
OutputDebugString("GetCurrentObj failed\n");
return true;
}
SelectObject(hdcMem, hBitmap);
RECTL rcBounds = { 0, 0, width, height };
hr = pViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, hdcMain, hdcMem, &rcBounds, NULL, NULL, 0);
if (SUCCEEDED(hr)) {
CImage image;
image.Create(outputSize.cx, outputSize.cy, 24);
CImageDC imageDC(image);
::StretchBlt(imageDC, 0, 0, outputSize.cx, outputSize.cy, hdcMem, 0, 0, width, height, SRCCOPY);
//::BitBlt(imageDC, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY);
image.Save(szDestFilename);
}
SelectObject(hdcMem, oldHBitmap);
DeleteObject(hBitmap);
DeleteDC(hdcMem);
//DeleteDC(hdcMain);
ReleaseDC(dc);
pViewObject->Release();
}
pDispatch->Release();
}
return true;
}
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
by: evilrixPosted on 2008-01-31 at 13:51:31ID: 20791603
The following info may help you to track down if you have any heap related memory leaks.
/en-us/lib rary/ 974tc 9t1(VS.80) .aspx
/en-us/lib rary/ d41t2 2sb(VS.80) .aspx
om/kb/1515 85
/en-us/lib rary/ x98tx 3cf(VS.80) .aspx
You can use _CrtSetDbgFlag to enable CRT heap allocation debugging. This should be at the very start of your program.
E.g. _CrtSetDbgFlag ( _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) | _CRTDBG_LEAK_CHECK_DF );
http://msdn2.microsoft.com
You can use _CrtDumpMemoryLeaks to generate an error report if the application failed to free all the memory it allocated. This should be at the very end of your program.
http://msdn2.microsoft.com
Use can use _CrtSetBreakAlloc or _crtBreakAlloc to set break points where specific heap is allocated (as reported by CrtDumpMemoryLeaks) so that you can see where the problem starts
http://support.microsoft.c
Memory leak detection and isolation: http://msdn2.microsoft.com
-Rx.