+ -
当前位置:首页 → 问答吧 → StartDoc的问题

StartDoc的问题

时间:2011-12-21

来源:互联网

我用API写了个打印的程序,但是有时候在执行到StartDoc的时候会有异常:在Win7下程序会停止执行、无响应;在WinXp下程序会异常退出。
主要代码如下:
C/C++ code

    if(NULL!=(szDevice=strtok(szprinter,",")) && 
        NULL!=(szDriver=strtok(NULL,","))) 
    {
        if((hdcprint=CreateDC(szDriver,szDevice,NULL,NULL))!=0)
        {    
            if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
            { 

                //打印...
            }
            else
            {
                WriteLog("StartDoc failed!");
            }
        }
        else
        {
            WriteLog("CreateDC failed!");
        }
    }
    else
    {
        WriteLog("Failed to get printer info.!");
    }



其中,szprinter是打印机信息字符串,如“Adobe PDF,Adobe PDF Converter”。该字符串逗号前后的内容分别是LPPRINTER_INFO_2结构的pPrinterName成员和pDriverName成员,LPPRINTER_INFO_2结构的值通过EnumPrinters函数获取。

哪位老兄帮忙看一下原因,非常感谢!!

作者: ashamwolf   发布时间: 2011-12-21

补充一下,出现问题的时候,程序就停在StartDoc这条语句上,后面的WriteLog("StartDoc failed!");
没有写到日志中。
由于出现的几率不高,所以很难跟踪。
另外还有一个情况就是,连续打印大概76-77笔的时候,CreateDC就失败了,写入日志的错误说明是“传递给系统调用的数据区域太小”。

下面把释放内存的代码补充进来:
C/C++ code

    HDC hdcprint; 
    static DOCINFO di={sizeof(DOCINFO),"printer",NULL,NULL,0}; 

    if(NULL!=(szDevice=strtok(szprinter,",")) && 
        NULL!=(szDriver=strtok(NULL,","))) 
    {
        if((hdcprint=CreateDC(szDriver,szDevice,NULL,NULL))!=0)
        {    
            if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
            { 
                hfont = CreateFont(...);
                oldfont = (HFONT)::SelectObject(hdcprint, hfont);
                //打印...
                RestoreDC(hdcprint,-1); //恢复打印机设备句柄
                EndPage(hdcprint); //打印机停纸,停止打印
                EndDoc(hdcprint); //结束一个打印作业
            }
            else
            {
                WriteLog("StartDoc failed!");
            }

            SelectObject(hdcprint, oldfont);
            DeleteObject(hfont);
            DeleteDC(hdcprint);
        }
        else
        {
            WriteLog("CreateDC failed!");
        }
    }
    else
    {
        WriteLog("Failed to get printer info.!");
    }

作者: ashamwolf   发布时间: 2011-12-21

没有人知道吗

作者: ashamwolf   发布时间: 2011-12-21

热门下载

更多