现在用户那边有一个需求,就是:将某一些非法的打印机隐藏,只可选择指定的打印机。
我现在的思路是:Hook WinSpool.drv 的 EnumPrintersA和EnumPrinterW函数,然后只返回指定的打印机名称。
现在碰到的问题是:EnumPrintersA中不知道如何返回pPrinterNum内容。
请问各位大神,该如何返回。谢谢!!!

解决方案 »

  1.   


    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取出来即可。
    用完了别忘了释放内存;