【问题标题】:c++ GDI printing causes system to freezec++ GDI打印导致系统死机
【发布时间】:2019-11-23 00:03:53
【问题描述】:

我目前正在维护为 SD 卡创建标签的 c++ 软件的旧和平。该软件使用 GDI 创建打印作业,通常没有问题。但是,打印一定数量后,系统永远死机,甚至鼠标也不再响应。我不知道应用程序在哪里崩溃,因为它发生在不同的时间点,而且完全无法预测。我什至不确定我需要在这里显示什么代码。

我已经设置了大量的断点并逐步执行了代码的不同部分,但由于问题只是随机出现,因此我无法得出任何结论。我还尝试在不同的环境(例如 VM)上运行该应用程序,但无论我使用什么机器,问题都会再次出现。

HDC printerDC = CreateDCW(L"WINSPOOL", printers[SELECTED_PRINTERS[printerIndex]].c_str(), NULL, NULL);

DODEBUG(L"CreateDCW returned: " << printerDC << L" (should be something else than 0), GetLastError: " << GetLastError() << L" (should be 0)", L"CreateDCW");

SetGraphicsMode(printerDC, GM_ADVANCED);

int result4 = StartDocW(printerDC, &di);

DODEBUG(L"StartDocW returned: " << result4 << L" (should be greater than 0), GetLastError: " << GetLastError() << L" (should be 0)", L"StartDocW");

if(result4 > 0)
{
    int result5 = StartPage(printerDC);

    DODEBUG(L"StartPage returned: " << result5 << L" (should be greater than 0), GetLastError: " << GetLastError() << L" (should be 0)", L"StartPage");

    SetBkMode(printerDC, TRANSPARENT);

    //1 dpi = 0.03937 pixel/mm; 1 pixel/mm = 25.4 dpi; 1 dpi = 0.003937 pixel/papersize; 0.1 pixel/papersize = 25.4 dpi;
    //1 px / 1 mm = 25.4 dpi => 1 px = 25.4 dpi * 1 mm => 1/(25.4) px = 25.4 dpi * 1 mm
    //1 dpi = 0.03937 pixel/mm => 1dpi * 1mm = 0.03937 pixel

    BITMAPINFOHEADER bi = { 0 };
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biHeight = (printerPaperYResolution * printLength) / 254;
    bi.biWidth = (printerPaperXResolution * printWidth) / 254;
    bi.biPlanes = 1;
    bi.biBitCount = 24;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;

    //Fix divisible-by-4-bug:
    LONG byteWidth = bi.biWidth * 3;
    LONG xDiv = byteWidth % 12;
    if(xDiv > 0)
    {
        bi.biWidth += (12 - xDiv) / 3;
        byteWidth = bi.biWidth * 3;
    }
    LONG yDiv = (bi.biHeight * 3) % 12;
    if(yDiv > 0)
    {
        bi.biHeight += (12 - yDiv) / 3;
    }

    LONG byteCount = 3 * bi.biHeight*bi.biWidth;

    byte* pBits = new byte[byteCount];
    memset(pBits, 255, byteCount);


    switch(printerIndex)
    {
    case PRINTER_ZERTIFIKAT:
        PrintZertifikat(sdCardData, printerDC, pBits, byteCount, byteWidth, &bi);
        break;
    case PRINTER_LABEL_PACKUNG:
        PrintLabelPackung(sdCardData, printerDC, pBits, byteCount, byteWidth, &bi);
        break;
    case PRINTER_LABEL_SDKARTE:
        PrintLabelSDKarte(sdCardData, printerDC, pBits, byteCount, byteWidth, &bi);
        break;
    case PRINT_ONLY_SDLABEL:
        PrintOnlySDLabel(sdCardData, printerDC, pBits, byteCount, byteWidth, &bi);
        break;
    }


    int result6 = EndPage(printerDC);

    DODEBUG(L"EndPage returned: " << result6 << L" (should be greater than 0), GetLastError: " << GetLastError() << L" (should be 0)", L"EndPage");

    int result7 = EndDoc(printerDC);
}   

【问题讨论】:

  • 你为什么用byte* pBits = new byte[byteCount];分配内存?你的打印函数会释放这个内存吗?
  • 是:删除[] pBits; pBits = NULL;

标签: c++ winapi gdi


【解决方案1】:

您是否使用DeleteDC() 正确发布了您的 HDC?

【讨论】:

  • 好电话,我确实忘记了。让我们看看结果如何。
  • 我进行了一些容量测试,问题似乎已经消失。谢谢你指出我的马虎!
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多