Windows C ++打开带有documentproperties的打印机得到C6836“Write Overrun”代码分析警告

在下面的代码中:

// 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; } 

在线上

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

当我运行Visual Studio 2012“代码分析”function时,会引发警告:

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

代码function正常,但不知道如何解决这个警告发生(最好不禁止警告)

此错误的帮助页面似乎并不适用(或者我无法确定它是如何) http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=zh-CN&k=k(C6386) &RD =真

DocumentProperties的SAL注释不能表示DEVMODE是比可能大于声明大小的结构。 该函数不会带有一个参数来说明传递的DEVMODE的大小。 结构也没有一个单一的字段来说明大小。 所以不能使用像__out_bcount_opt__out_bcount_part这样的注释。

所有使用DEVMODE的winapi函数都是一个问题。 这是一个从石器时代开始的结构,早在SAL就在地平线之前。 如果微软能够做到这一切,那么他们会这样做。 现在太迟了。

没有什么可以做的,除了知道你是正确的,工具错了。 这只是一个警告。