Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.032 c
1-1117139484
Дронище
2005-05-27 00:31
2005.06.14
Эмуляция нажати клавиши


1-1116939128
Новичек
2005-05-24 16:52
2005.06.14
Приоритет потока.


3-1115277422
Dels
2005-05-05 11:17
2005.06.14
Компонент DBMemo в Windows XP


14-1116997177
Kerk
2005-05-25 08:59
2005.06.14
С днем рожденья! 25 мая


4-1114410831
4dept
2005-04-25 10:33
2005.06.14
Как открыть в explorer e сетевой ресурс(комп, папку)?