изменение параметров печати принтера
От: magcyril Россия  
Дата: 24.05.02 09:11
Оценка:
Привет,

задача: изменить качество печати документов на сетевом принтере для данного пользователя

проблема: после установки необходимых параметров при вызове SetPrinter выдается ошибка "Access denied". Судя по всему, вызов пытается изменить настройки печати непосредственно на сетевом принтере и терпит неудачу. В документации на
microsoft сказано, что есть два способа подключения к принтеру:

1. по friendly name
2. по UNC

если подключаться по UNC, то возникает описанная выше проблема
как получить friendly name вообще не ясно, т.к. функции API (на Win2K) возвращают имя принтера только в формате UNC

Как с этим бороться?

Кирилл
Christmas spirit is not what you drink
Re: изменение параметров печати принтера
От: Patalog Россия  
Дата: 24.05.02 13:24
Оценка:
Здравствуйте magcyril, Вы писали:

M>Привет,


M>задача: изменить качество печати документов на сетевом принтере для данного пользователя


M>проблема: после установки необходимых параметров при вызове SetPrinter выдается ошибка "Access denied". Судя по всему, вызов пытается изменить настройки печати непосредственно на сетевом принтере и терпит неудачу. В документации на

M>microsoft сказано, что есть два способа подключения к принтеру:

M>1. по friendly name

M>2. по UNC

M>если подключаться по UNC, то возникает описанная выше проблема

M>как получить friendly name вообще не ясно, т.к. функции API (на Win2K) возвращают имя принтера только в формате UNC

M>Как с этим бороться?


А поменять параметры в DEVMODE перед вызовом OpenPrinter не получается? Я именно так и делаю, и вроде работает...
А что касается PrinterName, ShareName, PortName и иже с ними, то скорее всего и не дадут, если конечно ты не админ. Впрочем это более другие параметры и к качеству печати отношения не имеют.
Почетный кавалер ордена Совка.
Re[2]: изменение параметров печати принтера
От: magcyril Россия  
Дата: 24.05.02 13:36
Оценка:
Здравствуйте Patalog, Вы писали:

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


M>>Привет,


M>>задача: изменить качество печати документов на сетевом принтере для данного пользователя


M>>проблема: после установки необходимых параметров при вызове SetPrinter выдается ошибка "Access denied". Судя по всему, вызов пытается изменить настройки печати непосредственно на сетевом принтере и терпит неудачу. В документации на

M>>microsoft сказано, что есть два способа подключения к принтеру:

M>>1. по friendly name

M>>2. по UNC

M>>если подключаться по UNC, то возникает описанная выше проблема

M>>как получить friendly name вообще не ясно, т.к. функции API (на Win2K) возвращают имя принтера только в формате UNC

M>>Как с этим бороться?


P>А поменять параметры в DEVMODE перед вызовом OpenPrinter не получается? Я именно так и делаю, и вроде работает...

P>А что касается PrinterName, ShareName, PortName и иже с ними, то скорее всего и не дадут, если конечно ты не админ. Впрочем это более другие параметры и к качеству печати отношения не имеют.


я пытался менять только pDevMode->dmPrintQuality (и dmFields = DM_PRINTQUALITY соответственно) причем как с вызовом DocumentProperties (рекомендация MSDN), так и без него (GetPrinter может и так получить PRINTER_INFO_2), но при вызове SetPrinter всегда получаю ошибку "Access is denied"
Christmas spirit is not what you drink
Re[3]: изменение параметров печати принтера
От: Patalog Россия  
Дата: 25.05.02 08:55
Оценка:
Здравствуйте magcyril, Вы писали:

[skip]
M>я пытался менять только pDevMode->dmPrintQuality (и dmFields = DM_PRINTQUALITY соответственно) причем как с вызовом DocumentProperties (рекомендация MSDN), так и без него (GetPrinter может и так получить PRINTER_INFO_2), но при вызове SetPrinter всегда получаю ошибку "Access is denied"

Не знаю что у тебя за нужда вызывать именно SetPrinter? Эта функция помимо DEVMODE изменяет еще много параметров, на изменение которых у тебя прав по видимому нет. Я делаю так:
PRINTDLG pd;
const int size = sizeof(pd);
memset(&pd, 0, size);
pd.lStructSize = size;
BOOL res = ::PrintDlg(&pd);
if(res) {
    DEVMODE* dm = reinterpret_cast<DEVMODE*>(::GlobalLock(pd.hDevMode));
    if(dm) {
        dm->dmFields = DM_ORIENTATION | DM_PRINTQUALITY;
        dm->dmOrientation = DMORIENT_LANDSCAPE;
        dm->dmPrintQuality = 600;
        ::GlobalUnlock(pd.hDevMode);
    }
        char* prn_name = reinterpret_cast<char*>(dm->dmDeviceName);
        HANDLE printer = NULL;
    BOOL res = OpenPrinter(prn_name, &printer, NULL);
        if(res) {
                // TO DO ...
                ClosePrinter(printer);
        }
}


ЗЫж А вообще, прислал бы код, а то так гадать можно долго...
Почетный кавалер ордена Совка.
Re[4]: изменение параметров печати принтера
От: magcyril Россия  
Дата: 27.05.02 10:59
Оценка:
P>ЗЫж А вообще, прислал бы код, а то так гадать можно долго...

спасибо за пример, но мне надо изменить свойства принтера перманентно и локально.
это будет происходить при заходе в пользователя в домен. на локальной машине я админ

вот код с сокращениями, на SetPrinter на Win2K получаю "Access is denied", т.к.
код "лезет" менять настройки непосредственно на сетевом принтере (?)


#include <windows.h>
#include <winspool.h>
#include <stdio.h>
#include <tchar.h>
#include <malloc.h>

int _tmain(int argc, _TCHAR* argv[])
{
const DWORD datalength = 1024; // длина массивов
_TCHAR PrinterName[datalength]; // имя принтера
DWORD dwLength = datalength;

// получаем имя принтера по умолчанию
GetDefaultPrinter(PrinterName, &dwLength);

// открываем принтер по умолчанию
HANDLE phPrinter;
OpenPrinter(PrinterName, &phPrinter, NULL);

// получаем текущие настройки принтера
// 1) получаем размер структуры памяти DEVMODE под свойства принтера
LONG bytes = DocumentProperties(NULL, phPrinter, PrinterName, NULL, NULL, 0);
DEVMODE *dvMode;
dvMode = (DEVMODE *)malloc(bytes);

// 2) получаем текущие настройки принтера
DocumentProperties(NULL, phPrinter, PrinterName, dvMode, NULL, DM_OUT_BUFFER);

// 3аменяем разрещающую способность печати
(*dvMode).dmPrintQuality = DMRES_LOW;
(*dvMode).dmFields = DM_PRINTQUALITY;

// запоминаем новые настройки
DocumentProperties(NULL, phPrinter, PrinterName, dvMode, dvMode, DM_IN_BUFFER | DM_OUT_BUFFER);

DWORD Level = 2; // information level
PRINTER_INFO_2 *pPrinter = NULL;
DWORD cbBuf = 0; // size of buffer
DWORD dwNeeded = 0; // bytes received or required

// получаем размер памяти под PRINTER_INFO_2
GetPrinter(phPrinter, 2, 0, 0, &dwNeeded);

// выделяем память под PRINTER_INFO_2
pPrinter = (PRINTER_INFO_2 *)malloc(dwNeeded);
cbBuf = dwNeeded + 1;


GetPrinter(phPrinter, Level, (BYTE*)pPrinter, cbBuf, &dwNeeded);
(*pPrinter).pDevMode = dvMode; // новые настройки

// запоминаем установки
SetPrinter(phPrinter, Level, (BYTE*)pPrinter, 0);

ClosePrinter(&phPrinter);

return 0;
}
Christmas spirit is not what you drink
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.