Главная страница
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.055 c
11-1084360316
AlexR
2004-05-12 15:11
2005.06.14
ScrollBox и мышь


1-1117179617
Svit_men
2005-05-27 11:40
2005.06.14
Как подменить нажатую клавишу


1-1117195187
Intro
2005-05-27 15:59
2005.06.14
FileListBox


3-1115511543
UserCP
2005-05-08 04:19
2005.06.14
Как вставить и прочитать в MSSQL графическое изображение?


4-1114164757
VVV-First
2005-04-22 14:12
2005.06.14
Memory Mapped Files