задача: изменить качество печати документов на сетевом принтере для данного пользователя
проблема: после установки необходимых параметров при вызове SetPrinter выдается ошибка "Access denied". Судя по всему, вызов пытается изменить настройки печати непосредственно на сетевом принтере и терпит неудачу. В документации на microsoft сказано, что есть два способа подключения к принтеру:
1. по friendly name
2. по UNC
если подключаться по UNC, то возникает описанная выше проблема
как получить friendly name вообще не ясно, т.к. функции API (на Win2K) возвращают имя принтера только в формате UNC
Здравствуйте 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 и иже с ними, то скорее всего и не дадут, если конечно ты не админ. Впрочем это более другие параметры и к качеству печати отношения не имеют.
Здравствуйте 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"
[skip] M>я пытался менять только pDevMode->dmPrintQuality (и dmFields = DM_PRINTQUALITY соответственно) причем как с вызовом DocumentProperties (рекомендация MSDN), так и без него (GetPrinter может и так получить PRINTER_INFO_2), но при вызове SetPrinter всегда получаю ошибку "Access is denied"
Не знаю что у тебя за нужда вызывать именно SetPrinter? Эта функция помимо DEVMODE изменяет еще много параметров, на изменение которых у тебя прав по видимому нет. Я делаю так:
P>ЗЫж А вообще, прислал бы код, а то так гадать можно долго...
спасибо за пример, но мне надо изменить свойства принтера перманентно и локально.
это будет происходить при заходе в пользователя в домен. на локальной машине я админ
вот код с сокращениями, на SetPrinter на Win2K получаю "Access is denied", т.к.
код "лезет" менять настройки непосредственно на сетевом принтере (?)
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);