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);