c++ GDI打印导致系统卡住

标签 c++ winapi gdi

我目前正在维护一个为 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);
}   

最佳答案

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

关于c++ GDI打印导致系统卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57020201/

相关文章:

c++ - 如何防止链接器优化掉启动代码?

c++ - Sleep() 在 winapi32 中不起作用?

c - 从窗口中删除按钮

winapi - 如何在 Windows CE 控制台应用程序中处理 Ctrl+C?

c++ - 为什么使用 GetPixel 会导致 "undefined reference"?

c# - 如何将 vector<double> 从 C++ 编码到 C#

c++ - 如何在类函数中创建线程?

c++ - vector vs unique_ptr 到 c 风格的函数

从像素缓冲区创建 HBITMAP 然后渲染

c# - 'GraphicsPath.AddString' 中的字体比通常的字体小