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

Тема в разделе "WASM.WIN32", создана пользователем CNemo, 20 апр 2005.

  1. CNemo

    CNemo New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2005
    Сообщения:
    2
    Имеется код использующий 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, но поскольку печать идет из одного процесса, то не понятно как вывести имя пользователя поставившего задание.



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

    Sten New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2003
    Сообщения:
    39
    Сервис у тебя под каким аккаунтом работает? Если под SYSTEM - то он по определению не имеет доступа к сети.
     
  3. CNemo

    CNemo New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2005
    Сообщения:
    2
    Я пробовал из тестовой проги...

    Просто упомянул, что в итоге это должен быть сервис.