Как сменить формат бумаги на принтере?
От: DNS Россия  
Дата: 21.05.04 13:22
Оценка:
Добрый день!
Есть у меня такой код...

  HANDLE hPrn;
  PRINTER_DEFAULTS Defs;
  ZeroMemory(&Defs,sizeof(PRINTER_DEFAULTS));
  Defs.DesiredAccess=PRINTER_ALL_ACCESS;
  BOOL bOk=OpenPrinter(argv[1],&hPrn,&Defs);
  if (bOk){
    PRINTER_INFO_8* pPrn=0;
    DWORD dw=0;
    bOk=GetPrinter(hPrn,8,(LPBYTE)pPrn,0,&dw);
    pPrn=(PRINTER_INFO_8*)HeapAlloc(GetProcessHeap(),0,dw);
    bOk=GetPrinter(hPrn,8,(LPBYTE)pPrn,dw,&dw);
    if (bOk&&pPrn->pDevMode){
      printf((char*)pPrn->pDevMode->dmDeviceName);
      pPrn->pDevMode->dmPaperWidth=300;      
      pPrn->pDevMode->dmPaperLength=100;
      bOk=SetPrinter(hPrn,8,(LPBYTE)pPrn,0);
      bOk=GetPrinter(hPrn,8,(LPBYTE)pPrn,dw,&dw);
    } else {
      printf("Can't get printer's DeviceMode. Terminating.\n");
    }


Он работает, всё нормально вроде...
Но почему-то я не могу получить PRINTER_INFO_9.
Т.е. если везде в коде поменять на другой уровень, то

bOk=GetPrinter(hPrn,9,(LPBYTE)pPrn,dw,&dw);


после запуска в bOk — 1, но pPrn->pDevMode = 0
Никак не пойму что не так
Д.Н.С.
Re: Как сменить формат бумаги на принтере?
От: Аноним  
Дата: 12.11.04 15:32
Оценка:
Здравствуйте, DNS, Вы писали:

> Как сменить формат бумаги на принтере?


BOOL SetPaperSize( LPTSTR strPrinterName, const UINT& nPaperHeight, const UINT& nPaperWidth )
{
HANDLE ph = 0;
BOOL bRet = TRUE;
DEVMODE* pDevMode = 0;
try
{
if ( !OpenPrinter( strPrinterName, &ph, 0) )
{
throw 0;
}
LONG len = DocumentProperties( 0, ph, strPrinterName, 0, 0, 0);
if (len <= 0)
{
throw 0;
}
pDevMode = (DEVMODE*) new BYTE[ len ];
memset( pDevMode, 0, len );
if (DocumentProperties( 0, ph, strPrinterName, dm, 0, DM_OUT_BUFFER ) < 0)
{
throw 0;
}
dm->dmFields = DM_PAPERLENGTH | DM_PAPERWIDTH;
// new paper size
dm->dmPaperLength = nPaperHeight;
dm->dmPaperWidth = nPaperWidth;
DocumentProperties( 0, ph, strPrinterName, pDevMode, dm, DM_OUT_BUFFER | DM_IN_BUFFER);
}
catch (...)
{
assert( 0 );
bRet = FALSE;
}
if ( ph ) ClosePrinter( ph );
delete [] (BYTE*) pDevMode;
return bRet;
}

любой размер бумаги можно установить, если в свойствах принтера по умолчанию для paper size выбрано Custom
если выбрано Statdard, то таким способом можно установить бумагу только из предлогаемого списка, в противном случае размеры бумаги будут автоматически сброшены в default
Re[2]: Как сменить формат бумаги на принтере?
От: Аноним  
Дата: 12.11.04 15:36
Оценка:
Здравствуйте, Аноним, Вы писали:

Sorry, dm заменить на pDevMode

А>Здравствуйте, DNS, Вы писали:


>> Как сменить формат бумаги на принтере?


А>BOOL SetPaperSize( LPTSTR strPrinterName, const UINT& nPaperHeight, const UINT& nPaperWidth )

А>{
А> HANDLE ph = 0;
А> BOOL bRet = TRUE;
А> DEVMODE* pDevMode = 0;
А> try
А> {
А> if ( !OpenPrinter( strPrinterName, &ph, 0) )
А> {
А> throw 0;
А> }
А> LONG len = DocumentProperties( 0, ph, strPrinterName, 0, 0, 0);
А> if (len <= 0)
А> {
А> throw 0;
А> }
А> pDevMode = (DEVMODE*) new BYTE[ len ];
А> memset( pDevMode, 0, len );
А> if (DocumentProperties( 0, ph, strPrinterName, dm, 0, DM_OUT_BUFFER ) < 0)
А> {
А> throw 0;
А> }
dm->>dmFields = DM_PAPERLENGTH | DM_PAPERWIDTH;
А> // new paper size
dm->>dmPaperLength = nPaperHeight;
dm->>dmPaperWidth = nPaperWidth;
А> DocumentProperties( 0, ph, strPrinterName, pDevMode, dm, DM_OUT_BUFFER | DM_IN_BUFFER);
А> }
А> catch (...)
А> {
А> assert( 0 );
А> bRet = FALSE;
А> }
А> if ( ph ) ClosePrinter( ph );
А> delete [] (BYTE*) pDevMode;
А> return bRet;
А>}

А>любой размер бумаги можно установить, если в свойствах принтера по умолчанию для paper size выбрано Custom

А>если выбрано Statdard, то таким способом можно установить бумагу только из предлогаемого списка, в противном случае размеры бумаги будут автоматически сброшены в default
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.