SetPrinter() 使用范例

 

// MySetPrinter
//
// Demonstrates how to use the SetPrinter API.  This particular function changes the orienation
// for the printer specified in pPrinterName to the orientation specified in dmOrientation.
//
// Valid values for dmOrientation are:
// DMORIENT_PORTRAIT (1)
// or
// DMORIENT_LANDSCAPE (2)
BOOL MySetPrinter(LPTSTR pPrinterName, short dmOrientation)
{
 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(pPrinterName, &hPrinter, &pd);
 if (!bFlag || (hPrinter == NULL))
  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);
  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;
 }

 // If GetPrinter didn't fill in the DEVMODE, try to get it by calling
 // DocumentProperties...
 if (pi2->pDevMode == NULL)
 {
  dwNeeded = DocumentProperties(NULL, hPrinter,
      pPrinterName,
      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,
      pPrinterName,
      pDevMode, NULL,
      DM_OUT_BUFFER);
  if (lFlag != IDOK || pDevMode == NULL)
  {
   GlobalFree(pDevMode);
   GlobalFree(pi2);
   ClosePrinter(hPrinter);
   return FALSE;
  }

  pi2->pDevMode = pDevMode;
 }

 // Driver is reporting that it doesn't support this change...
 if (!(pi2->pDevMode->dmFields & DM_ORIENTATION))
 {
  GlobalFree(pi2);
  ClosePrinter(hPrinter);
  if (pDevMode)
   GlobalFree(pDevMode);
  return FALSE;
 }

 // Specify exactly what we are attempting to change...
 pi2->pDevMode->dmFields = DM_ORIENTATION;
 pi2->pDevMode->dmOrientation = dmOrientation;

 // Do not attempt to set security descriptor...
 pi2->pSecurityDescriptor = NULL;

 // Make sure the driver-dependent part of devmode is updated...
 lFlag = DocumentProperties(NULL, hPrinter,
    pPrinterName,
    pi2->pDevMode, pi2->pDevMode,
    DM_IN_BUFFER | DM_OUT_BUFFER);
 if (lFlag != IDOK)
 {
  GlobalFree(pi2);
  ClosePrinter(hPrinter);
  if (pDevMode)
   GlobalFree(pDevMode);
  return FALSE;
 }

 // Update printer information...
 bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0);
 if (!bFlag)
 // The driver doesn't support, or it is unable to make the change...
 {
  GlobalFree(pi2);
  ClosePrinter(hPrinter);
  if (pDevMode)
   GlobalFree(pDevMode);
  return FALSE;
 }

 // Tell other apps that there was a change...
 SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L,
     (LPARAM)(LPCSTR)pPrinterName,
     SMTO_NORMAL, 1000, NULL);

 // Clean up...
 if (pi2)
  GlobalFree(pi2);
 if (hPrinter)
  ClosePrinter(hPrinter);
 if (pDevMode)
  GlobalFree(pDevMode);

 return TRUE;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值