现在用户那边有一个需求,就是:将某一些非法的打印机隐藏,只可选择指定的打印机。
我现在的思路是:Hook WinSpool.drv 的 EnumPrintersA和EnumPrinterW函数,然后只返回指定的打印机名称。
现在碰到的问题是:EnumPrintersA中不知道如何返回pPrinterNum内容。
请问各位大神,该如何返回。谢谢!!!
我现在的思路是:Hook WinSpool.drv 的 EnumPrintersA和EnumPrinterW函数,然后只返回指定的打印机名称。
现在碰到的问题是:EnumPrintersA中不知道如何返回pPrinterNum内容。
请问各位大神,该如何返回。谢谢!!!
int ret;
PRINTER_INFO_2 * pPrinterInfo;
PRINTER_INFO_2 * m_pPrinterInfo;
m_pPrinterInfo = new PRINTER_INFO_2;
//枚举第一次,返回打印机的数量,EnumPrinters这个函数必须要这样用,第一次函数不会返回成功;
ret = EnumPrinters( PRINTER_ENUM_LOCAL,NULL,2,(LPBYTE)m_pPrinterInfo,sizeof(PRINTER_INFO_2),&dwNeed,&dwReturn );
delete m_pPrinterInfo;
if( ( m_pPrinterInfo = ( PRINTER_INFO_2 * )new BYTE[dwNeed] ) == NULL )
return 0;
//枚举第二次,得到已安装的打印机;
ret = EnumPrinters (PRINTER_ENUM_LOCAL,NULL,2,(LPBYTE)m_pPrinterInfo,dwNeed,&dwTemp,&dwReturn); CString str1;
for (int i = 0; i < dwReturn; i++ )
{
pPrinterInfo = m_pPrinterInfo + i;
str1.Format("%s",pPrinterInfo->pPrinterName );
AfxMessageBox(str1);//枚举到的每一个打印机,你筛选你需要的就可以了。
}
枚举到的打印机保存在m_pPrinterInfo中,然后你逐个将pPrinterInfo->pPrinterName取出来即可。
用完了别忘了释放内存;