C ++,win32错误

时间:2015-02-25 12:30:56

标签: c++ winapi

我试图运行以下代码:

#include "stdafx.h"
#include <windows.h>
#include <winspool.h>
HDC GetPrinterDC (void)
{
    DWORD dwNeeded, dwReturned ;
    HDC hdc ;
    PRINTER_INFO_4 * pinfo4 ;


        EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, NULL,
            0, &dwNeeded, &dwReturned) ;
        pinfo4 = new PRINTER_INFO_4 [dwNeeded/sizeof(PRINTER_INFO_4)] ;
        EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4,
            dwNeeded, &dwNeeded, &dwReturned) ;
        hdc = CreateDC (NULL, pinfo4->pPrinterName, NULL, NULL) ;
        free (pinfo4) ;

    return hdc ;
}

但我一直收到错误&#34; Win32Project1.exe已触发断点。&#34;。当我按下继续时,我最终会出现错误&#34; Debug assertion failed&#34;。 错误发生在&#34; free(pinfo4)&#34;线。

非常感谢任何帮助。

附加说明:还尝试过&#34;删除[] pinfo4;&#34;

附加说明:程序在中断时显示。我的代码https://drive.google.com/file/d/0BwFUfWkiqC7VZkdrU04zZ3pqZUU/view?usp=sharing

4 个答案:

答案 0 :(得分:2)

free (pinfo4) ; {} {1}},delete[] pinfo4。将freemalloc一起使用 - 这就是C程序。在c ++中使用newdelete.

关于代码的另一个奇怪的事情,您使用:pinfo4->pPrinterName,,但pinfo4是一个数组,因此您应该使用:pinfo4[0]->pPrinterName或其他索引。还要确保dwNeeded不为零。

答案 1 :(得分:1)

从文档中,重点补充说:

  

缓冲区必须足够大才能接收结构成员指向的数据结构数组和任何字符串或其他数据。如果缓冲区太小,pcbNeeded参数将返回所需的缓冲区大小。

这意味着缓冲区不是所有数组。因此,计算数组项的数量并仅分配它可能会给你一个太短的缓冲区。考虑要么只是分配字节,要么舍入向上而不是向下除法结果。


此外,请勿使用new分配并使用free取消分配。那是正式的UB。相反,只需使用std::vector个字节。

答案 2 :(得分:0)

您可以尝试下面的代码

#include "stdafx.h"
#include <windows.h>
#include <winspool.h>
HDC GetPrinterDC (void)
{
    DWORD dwNeeded, dwReturned ;
    HDC hdc ;
    PRINTER_INFO_4 * pinfo4 ;


        EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, NULL,
            0, &dwNeeded, &dwReturned) ;
        if (dwNeeded <= 0)
            return NULL;
        pinfo4 = new PRINTER_INFO_4 [dwNeeded/sizeof(PRINTER_INFO_4)] ;
        EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4,
            dwNeeded, &dwNeeded, &dwReturned) ;

        hdc = CreateDC (NULL, pinfo4[0]->pPrinterName, NULL, NULL) ;
        delete [] pinfo4 ;

    return hdc ;
}

答案 3 :(得分:0)

您可能分配的空间少于所需的空间。考虑(理论上)dwNeeded = 5和sizeof(PRINTER_INFO_4)= 4的情况。

您的代码将分配单个(5/4 == 1)PRINTER_INFO_4,EnumPrinters将超出提供的缓冲区。最好准确分配dwNeeded BYTE,然后再将它们重新解释为PRINTER_INFO_4。

而且,正如marcinj所说,你应该使用malloc / free或new [] / delete []。