hur.cn - 华软网

 热门搜索

获取打印机状态,急!!!!!!!

  作者:未知    来源:网络    更新时间:2010/7/28
我想猎取打印机的状态,于是我就用了以下的代码
    openPrinter(...);//成功前往 
    GetPrinter(hPrinter,   2,   pPrinterInfo,   dwNeeded,   &dwNeeded);  
现在的问题是不论打印实际处于什么状态,pPrinterInfo^.status总是为0,这让我十分的郁闷, 
打印机型号:三星   ML-2010   端口是USB001。请列位大侠帮帮助。
---华软 网友回答---
怎么没人回答呢,分不够能够加啊 
---华软网友回复---
帮你顶!
---华软网友回复---
引用 2 楼 w174504744 的回复:
帮你顶!

谢了,高手赶忙来啊
---华软网友回复---
没做过,帮顶,学习~~
---华软网友回复---
http://blog.sina.com.cn/s/blog_4b44e1c00100ge82.html
---华软网友回复---
11没做过,帮顶,学习~~
---华软网友回复---
引用 5 楼 stonewater 的回复:
http://blog.sina.com.cn/s/blog_4b44e1c00100ge82.html

谢谢 关注 他用的方法跟我用的一样都是GetPrinter函数的调用 然后取得Status的值,现在的问题关头是这个值他总是0
---华软网友回复---
DWORD cByteNeeded,cByteUsed;
if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
 {
  DWORD dwErrorCode = ::GetLastError();
 }

 PRINTER_INFO_2 *pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
 
 if (!GetPrinter(hPrinter,
  2,
  (LPBYTE)pPrinterInfo,
  cByteNeeded,
  &cByteUsed))
 {  
  DWORD dwErrorCode = ::GetLastError();
 }

 

---华软网友回复---
GetLastError()看看什么毛病
---华软网友回复---
引用 9 楼 stonewater 的回复:
GetLastError()看看什么毛病

没有犯错,函数成功调用,pPrinterInfo里的其余属性的值都是正常的跟打印机的属性相符,惟独这个status出问题
---华软网友回复---
C++">
 HANDLE hPrinter = NULL;  
    DWORD dwNeeded = 0;  
    PRINTER_INFO_2 *pi2 = NULL;  
    DEVMODE *pDevMode = NULL;  
    PRINTER_DEFAULTS pd;  
    BOOL bFlag;  
    LONG lFlag;  
   
  //   Open   printer   handle   (on   Windows   NT,   you   need   full-access   because   you  
  //   will   eventually   use   SetPrinter)...  
    ZeroMemory(&pd, sizeof(pd));  
    pd.DesiredAccess = PRINTER_ALL_ACCESS;  
    bFlag = OpenPrinter(lpPrinterName, &hPrinter, &pd);  
    if(!bFlag || (hPrinter == NULL))  {
AfxMessageBox( "没法打开指定的打印机!" ) ;
       return FALSE;  
    }
    //   The   first   GetPrinter   tells   you   how   big   the   buffer   should   be   in    
    //   order   to   hold   all   of   PRINTER_INFO_2.   Note   that   this   should   fail   with    
    //   ERROR_INSUFFICIENT_BUFFER.     If   GetPrinter   fails   for   any   other   reason    
    //   or   dwNeeded   isn't   set   for   some   reason,   then   there   is   a   problem...  
    SetLastError(0);  
    bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);  
    if((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0))  
{  
       ClosePrinter(hPrinter);  
   AfxMessageBox( "Cannot get the size of the DEVMODE structure" ) ;
       return FALSE;  
}  
 
     //   Allocate   enough   space   for   PRINTER_INFO_2...  
    pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);  
    if(pi2 == NULL)  
{  
       ClosePrinter(hPrinter);  
       return  FALSE;  
}  
    //   The   second   GetPrinter   fills   in   all   the   current   settings,   so   all   you  
    //   need   to   do   is   modify   what   you're   interested   in...  
    bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);  
    if (!bFlag)  
{  
      GlobalFree(pi2);  
      ClosePrinter(hPrinter);  
      return FALSE;  

---华软网友回复---
C++">
 HANDLE hPrinter = NULL;  
    DWORD dwNeeded = 0;  
    PRINTER_INFO_2 *pi2 = NULL;  
    DEVMODE *pDevMode = NULL;  
    PRINTER_DEFAULTS pd;  
    BOOL bFlag;  
    LONG lFlag;  
   
  //   Open   printer   handle   (on   Windows   NT,   you   need   full-access   because   you  
  //   will   eventually   use   SetPrinter)...  
    ZeroMemory(&pd, sizeof(pd));  
    pd.DesiredAccess = PRINTER_ALL_ACCESS;  
    bFlag = OpenPrinter(lpPrinterName, &hPrinter, &pd);  
    if(!bFlag || (hPrinter == NULL))  {
AfxMessageBox( "没法打开指定的打印机!" ) ;
       return FALSE;  
    }
    //   The   first   GetPrinter   tells   you   how   big   the   buffer   should   be   in    
    //   order   to   hold   all   of   PRINTER_INFO_2.   Note   that   this   should   fail   with    
    //   ERROR_INSUFFICIENT_BUFFER.     If   GetPrinter   fails   for   any   other   reason    
    //   or   dwNeeded   isn't   set   for   some   reason,   then   there   is   a   problem...  
    SetLastError(0);  
    bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);  
    if((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0))  
{  
       ClosePrinter(hPrinter);  
   AfxMessageBox( "Cannot get the size of the DEVMODE structure" ) ;
       return FALSE;  
}  
 
     //   Allocate   enough   space   for   PRINTER_INFO_2...  
    pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);  
    if(pi2 == NULL)  
{  
       ClosePrinter(hPrinter);  
       return  FALSE;  
}  
    //   The   second   GetPrinter   fills   in   all   the   current   settings,   so   all   you  
    //   need   to   do   is   modify   what   you're   interested   in...  
    bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);  
    if (!bFlag)  
{  
      GlobalFree(pi2);  
      ClosePrinter(hPrinter);  
      return FALSE;  

---华软网友回复---
应该这样:

        ::GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded);
if(0 < dwNeeded) {
             if (::GetPrinter(hPrinter, 2,  pPrinterInfo, dwNeeded, &dwNeeded)){
// here you will get  "pPrinterInfo"
}

}

---华软网友回复---
xueer8835
 
(小妖) 
是正确的!!!

---华软网友回复---
昨天由于下班所以没能及时回帖描写情况,谢谢列位关注小弟的情况。
现在的情况是运行代码,PRINTER_INFO_2结构的结果以下:
(“\\test”, “\\test\Samsung ML-2010 Series”, “SamsungM”, “USB001”, “Samsung ML-2010 Series”, “”, “”, $B8CE04, “”, “WinPrint”, “RAW”, “”, $B8CD04, 2584, 1, 0, 0, 0, 0, 0, 0).                      ↓                                          ↓
                        内存地址                                    内存地址

列位大侠在给分析分析。是否是那里犯错了
---华软网友回复---
另有个重要情况忘了说了,这个打印机是共享的打印机,其实不是跟我的主机相连,适才又看了下Getprinter函数,上面有这么句话:只有在发出调用的应用程序有足够的权限时,PRINTER_INFO_x结构中的一些字段才能够被读取。这类权限由系统当前的平安设置决意。我感觉是否是权限不够啊。
---华软网友回复---
又挖一空坟
---华软网友回复---
楼主问题解决了吗。
---华软网友回复---
同问,楼主问题解决了吗?      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。