Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

Как поставить задачу на удаленный принтер?   Найти похожие ветки 

 
Mike Evteev   (2005-04-20 17:07) [0]

Имеется код использующий OpenPrinter, AddJob, ScheduleJob.
Все работает нормально с локальным принтером.
При попытке открыть удаленный принтер - Code 5. Access Denied.

procedure SpoolFile(const FileName, PrinterName: string);
var
Buffer: record
JobInfo: record // ADDJOB_INFO_1
Path: PChar;
JobID: DWORD;
end;
PathBuffer: array[0..255] of Char;
end;

JobInfo: PJobInfo1;
PrinterDefaults: TPrinterDefaults;

SizeNeeded: DWORD;
Handle: THandle;
PrtName: string;
begin
PrtName := PrinterName;
if PrtName = "" then
PrtName := Printer.Printers[Printer.PrinterIndex]; // Default printer name

PrinterDefaults.pDatatype := "TEXT";
PrinterDefaults.pDevMode := nil;
PrinterDefaults.DesiredAccess := PRINTER_ALL_ACCESS;

Win32Check(OpenPrinter(PChar(PrtName), Handle, @PrinterDefaults));
try

Win32Check(AddJob(Handle, 1, @Buffer, SizeOf(Buffer), SizeNeeded));

//Finding size
GetJob(Handle, Buffer.JobInfo.JobID, 1, nil, 0, @SizeNeeded);
GetMem(JobInfo, SizeNeeded);
FillMemory(JobInfo, SizeNeeded, 0);
try
Win32Check(GetJob(Handle, Buffer.JobInfo.JobID, 1, JobInfo, SizeNeeded, @SizeNeeded));
TJobInfo1(JobInfo^).pDocument := PChar(FileName);
TJobInfo1(JobInfo^).pDatatype := "TEXT";
TJobInfo1(JobInfo^).TotalPages := 1000;
TJobInfo1(JobInfo^).PagesPrinted := 0;
TJobInfo1(JobInfo^).pUserName := "Vasia Pupkin";

Win32Check(SetJob(Handle, Buffer.JobInfo.JobID, 1, JobInfo, 0));
finally
FreeMemory(JobInfo);
end;

Win32Check(CopyFile(PChar(FileName), Buffer.JobInfo.Path, True);
Win32Check(ScheduleJob(Handle, Buffer.JobInfo.JobID)
finally
Win32Check(ClosePrinter(Handle));
end;

end;

Валится на OpenPrinter.

Что делать?
Кстати эта фигня должна выполняться из сервиса. Так что примите полномочия во внимание.

Еще вопрос - можно ли как-то управлять Separator Page динамически. Мне нужно писать LPD, но поскольку печать идет из одного процесса, то не понятно как вывести имя пользователя поставившего задание.

Буду благодарен за любую информацию!


 
Набережных С. ©   (2005-04-20 19:24) [1]

Потому, что от имени LocalSystem. В домене W2000 решается раздачей прав компьютеру. В NT можно завести специального пользователя и имперсонировать.


 
Mike Evteev   (2005-04-21 00:25) [2]

Прога выполнялась, не сервис. Это тестовый код.
До сервиса еще не дошло пока. Решил отладиться отдельно.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.037 c
1-1117437824
Rentgen
2005-05-30 11:23
2005.06.14
Как раскрыть весь TreeView?


4-1113908164
grigory
2005-04-19 14:56
2005.06.14
Снова Hook! Завершение процессов!


14-1116745105
totti
2005-05-22 10:58
2005.06.14
Матеметический компонент. Есть ли он в Делфи?


14-1116824427
Некто
2005-05-23 09:00
2005.06.14
Фанатам Carmageddon а


14-1116687140
some_user
2005-05-21 18:52
2005.06.14
Посоветуйте заменитель корзины Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский