VC++编写打印程序,release正常,debug模式提示错误,错误内容为coreapp.cpp文件释放打印机信息:
// free printer info
if (m_hDevMode != NULL)
AfxGlobalFree(m_hDevMode);
我的程序代码如下:
//纸张及纵向、横向打印默认选择
DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE;
CPrintDialog dlg(FALSE);
PRINTDLG pd;
pd.lStructSize = (DWORD)sizeof(PRINTDLG);
BOOL bRet = AfxGetApp()->GetPrinterDeviceDefaults(&pd);
if (bRet)
{
// protect memory handle with ::GlobalLock and ::GlobalUnlock
DEVMODE FAR* pDevMode = (DEVMODE FAR*)::GlobalLock(pd.hDevMode);
if (pDevMode != NULL)
{
pDevMode->dmPaperSize = DMPAPER_A4; //将打印纸设置为A4
//pDevMode->dmOrientation = DMORIENT_PORTRAIT;//纵向打印
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;//横向打印
}
dlg.m_pd.hDevMode = pd.hDevMode;
::GlobalUnlock(pd.hDevMode);
}
if (dlg.DoModal() == IDOK)
{
//得到打印机DC
HDC hDC = dlg.GetPrinterDC();
if (hDC == NULL)
{
return;
}
//经过HDC得到CDC指针
CDC* pDC = CDC::FromHandle(hDC);
pDC->m_bPrinting = TRUE;
short cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
short cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
DOUBLE xPix = (DOUBLE)cxInch * 10 / 254; //每 mm 宽度的像素
DOUBLE yPix = (DOUBLE)cyInch * 10 / 254; //每 mm 高度的像素
//文档信息
DOCINFO di;
::ZeroMemory(&di, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
str=L" CAA操作报告";
di.lpszDocName = str;
//A4开始打印210mm*297mm
int M, U;
int nColPos[11] = {200,500,1600,3500,3800,4250,4700,5300,6000,6400,6800};
CString strTitle[10] = {L"序号",L"工序",L"质检项目",L"标准",L"上限",L"下限",L"工具编号",L"操作时间",L"员工",L"结果"};
CFont FontBt, FontZw, FontZw2;
FontBt.CreateFont(180, 90, 0, 0, 400, FALSE, FALSE, 0,
GB2312_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, L"宋体");
CFont* pOldFont=NULL;
FontZw.CreateFont(110, 45, 0, 0, 300, FALSE, FALSE, 0,
GB2312_CHARSET, OUT_STROKE_PRECIS,
CLIP_STROKE_PRECIS, DRAFT_QUALITY,
VARIABLE_PITCH | FF_SWISS, _T("宋体"));
FontZw2.CreateFont(80, 30, 0, 0, 300, FALSE, FALSE, 0,
GB2312_CHARSET, OUT_STROKE_PRECIS,
CLIP_STROKE_PRECIS, DRAFT_QUALITY,
VARIABLE_PITCH | FF_SWISS, _T("宋体"));
BOOL bPrinting = (pDC->StartDoc(&di)>0);
int nPage = 1;
int nStep = 0;//0初始化 1正文
int nRow = 1;
CString WO_PROJECT, WO_TRAIN, WO_CAR, Mro_Code, INSPECTION_ITEMS, toolid, operationtime, staffID;
int StandardValue;
float CAAvalue;
int nItem = 0;
for(nItem=0; nItem<m_nTotalItem && bPrinting; nItem++)// 打印总行数m_nTotalItem
{
if (nStep == 0)
{
//文件标头
pDC->StartPage();
nStep = 1;
pOldFont=pDC->SelectObject(&FontBt);
M = 1000; //left margin
U = 300; //upper margin
pDC->TextOutW(3000, 300, L"CAA操作记录");
pDC->SelectObject(&FontZw);
U += 300;
}
//打印正文代码略
//下一行
nRow++;
U += 150;
if (nRow > nPage*24)
{
//超行
str.Format(L"第%d页", nPage);
pDC->TextOutW(3500, 4600, str);
bPrinting = (pDC->EndPage() > 0);
nStep = 0;
nPage++;
}
}
if (nRow % 24 > 0)
{
str.Format(L"第%d页", nPage);
pDC->TextOutW(3500, 4600, str);
}
bPrinting = (pDC->EndPage() > 0);
if (bPrinting)
{
pDC->EndDoc();
}
else
{
pDC->AbortDoc();
}
pDC->SelectObject(pOldFont);
//结束打印
pDC->EndDoc();
//删除DC
pDC->DeleteDC();
if (dlg.m_pd.hDC) // 检查设备上下文句柄是否非空
{
DeleteDC(dlg.m_pd.hDC); // 释放设备上下文句柄
}
if (dlg.m_pd.hDevMode) // 检查DevMode句柄是否非空
{
::GlobalFree(dlg.m_pd.hDevMode); // 释放DevMode句柄
dlg.m_pd.hDevMode = NULL;
}
if (dlg.m_pd.hDevNames) // 检查DevNames句柄是否非空
{
::GlobalFree(dlg.m_pd.hDevNames); // 释放DevNames句柄
}
}
if (pd.hDevMode != NULL)
{
::GlobalFree(pd.hDevMode);
pd.hDevMode = NULL;
}
if (pd.hDevNames != NULL)
{
::GlobalFree(pd.hDevNames);
}
搞不明白,我已经释放pd.hDevMode,而且pd.hDevMode=NULL,为什么在CWinApp::~CWinApp()中,m_hDevMode 并不为空。
尝试取消
```c++
`if (pd.hDevMode != NULL)
{::GlobalFree(pd.hDevMode);
pd.hDevMode = NULL;}
``,发现CWinApp::~CWinApp()中使用AfxGlobalFree(m_hDevMode);也出错。不知道什么原因,望专家指点!