C++ windows C++;使用documentproperties打开打印机获取C6836“;“写入溢出”;代码分析警告

C++ windows C++;使用documentproperties打开打印机获取C6836“;“写入溢出”;代码分析警告,c++,windows,winapi,C++,Windows,Winapi,在以下代码中: // If GetPrinter didn't fill in the DEVMODE, try to get it by calling // DocumentProperties... if (pi2->pDevMode == NULL) { dwNeeded = DocumentProperties(NULL, hPrinter, printerName, NULL, NULL, 0); if (dwNeeded &l

在以下代码中:

// If GetPrinter didn't fill in the DEVMODE, try to get it by calling
// DocumentProperties...
if (pi2->pDevMode == NULL)
{
    dwNeeded = DocumentProperties(NULL, hPrinter,
        printerName,
        NULL, NULL, 0);

    if (dwNeeded <= 0)
    {
        GlobalFree(pi2);
        ClosePrinter(hPrinter);
        return FALSE;
    }

    pDevMode = (DEVMODE *)GlobalAlloc(GPTR, dwNeeded);
    if (pDevMode == NULL)
    {
        GlobalFree(pi2);
        ClosePrinter(hPrinter);
        return FALSE;
    }

    lFlag = DocumentProperties(NULL, hPrinter,
        printerName,
        pDevMode, NULL,
        DM_OUT_BUFFER);

    if (lFlag != IDOK || pDevMode == NULL)
    {
        GlobalFree(pDevMode);
        GlobalFree(pi2);
        ClosePrinter(hPrinter);
        return FALSE;
    }

    pi2->pDevMode = pDevMode;
}
当我运行Visual Studio 2012“代码分析”功能时,它会抛出警告:

C6386写入到“pDevMode”时写入溢出缓冲区溢出:可写入大小为“dwNeeded”字节,但可能写入“220”字节。对“pDevMode”的写入无效,(超出其可写范围)

代码运行良好,但不知道如何修复此警告(最好不禁用警告)


此错误的帮助页似乎不适用(或者我不知道它是如何应用的)

DocumentProperties的SAL注释无法表示DEVMODE的结构可能大于其声明的大小。该函数也不接受说明DEVMODE传递大小的参数。结构也没有一个字段来表示大小。因此,像
\uuuuu out\u bcount\u opt
\uuu out\u bcount\u part
这样的注释无法使用

这是所有采用DEVMODE的winapi函数的问题。这座建筑可以追溯到石器时代,远远早于萨尔出现在地平线上。如果微软能重来一次,那么他们的做法就会有所不同。现在太晚了


除了知道你做对了,工具做错了,你什么也做不了。这只是一个警告。

一个microsoft软件告诉您使用
DocumentProperties
的返回值作为缓冲区大小,因为它可以大于
sizeof(DEVMODE)
,另一个microsoft软件告诉您使用
DEVMODE
。使用这两种尺寸中最大的一种怎么样。适应精神分裂症的软件很容易,UC!一般来说,所示代码存在不必要的冗余。在析构函数中进行清理。用C++代替C。
lFlag = DocumentProperties(NULL, hPrinter,
printerName,
pDevMode, NULL,
DM_OUT_BUFFER);