Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.02.2008, 14:56   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Как получить полный путь к файлу, который был послан на принтер?

В общем Нужно узнать какой файл в данный момент печатается принтером. Делаю это через FindFirstPrinterChangeNotification. Логгирование работает нормально, но хотелось бы получать не просто инфу о задании а еще и полный путь к файлу, который в этом задании.
Это при условии что распечатывается именно открытый файл, который был кем то создан, и помешен в папку с которой у нас происходит печать.

У кого какие идеи?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.02.2008, 15:16   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Stilet, EnumJobs / GetJob не подойдет?

http://msdn2.microsoft.com/en-us/lib...14(VS.85).aspx
B_N вне форума Ответить с цитированием
Старый 29.02.2008, 15:31   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да это я и использую. Вот смотри:
Код:
unit Unit1;

interface

uses          winspool,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var hp:THandle; jobs:array[0..50] of JOB_INFO_2; a,b:Cardinal;i:integer;
      hPrinter:Thandle;  htr:Cardinal; eb:BOOL;
  Form1: TForm1;

implementation

{$R *.dfm}
procedure tr;
begin
 while eb do begin
 hp:=FindFirstPrinterChangeNotification(hPrinter,PRINTER_CHANGE_ADD_JOB,
     0,0);
 WaitForSingleObject(hp,INFINITE);
 ZeroMemory(@jobs,sizeof(jobs));
 EnumJobs(hPrinter,0,50,2,@jobs,sizeof(jobs),a,b);
 //********* FOR ******************
 for i:=0  to b-1 do
 begin
  with form1 do begin
    ListBox1.Items.Add(jobs[i].pPrinterName+' '+jobs[i].pDocument);
    ListBox1.Items.Add(' '+jobs[i].pMachineName+' '+jobs[i].pParameters);
  end;
 end;
 //******* END FOR ****************{}
 FindClosePrinterChangeNotification(hp);
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
eb:=true;
if OpenPrinter('PDFCreator',hPrinter,0) then
 CreateThread(0,0,@tr,0,CREATE_NEW,htr)
else RaiseLastWin32Error;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 eb:=False;
 //WaitForSingleObject(htr,INFINITE);
end;

end.
Но в JOB_INFO_2 чет не нашел полного пути к файлу.
Не ну може я не заметил... Но помоему там нет такого, есть просто типа Заголовок получаю, это есть, а вот где этот файл находится увы не получаю, а это и нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.02.2008, 15:38   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А в pDocument чего дает? Чего-то я уже плохо помню, кажется там было, щас поэкспериментирую...
B_N вне форума Ответить с цитированием
Старый 29.02.2008, 15:52   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А он дает название документа, пославшего печать:"Microsoft Word - Документ1"
Я уж думаю сделать примерно так:

Попробовать узнать хендлы файлов которые открыл процесс, активный на данный момент, и по этим хендлам выдернуть полный путь

Отсюда вопрос: Напомни как второе реализовать

Вот щаз буду пробовать ZwQueryInformationProcess, но может есть чего другое...
I'm learning to live...

Последний раз редактировалось Stilet; 29.02.2008 в 16:05.
Stilet вне форума Ответить с цитированием
Старый 29.02.2008, 16:23   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Дык, "Microsoft Word - Документ1"... А если он из воздуха печатает, какое же там имя файла? Да и файл, в принципе, может быть уже закрыт к началу печати...
B_N вне форума Ответить с цитированием
Старый 29.02.2008, 16:57   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да эт я знаю, и это еще одна трудность.
Даже если я получу файлы, мне придется как то соспоставлять этот Microsoft Word - Документ1 с открытыми, а про печати нефайловые я вообще молчу, тут уж придется довольствоваться просто названием.

Но - дело в том что как правило документы формируются не на печатной машине. они туда уже попадают как файлы, потому 90% можно с уверенностью сказать что печать осуществлялась именно из файла, который физически есть, этого вполне хватит для логов.

Цитата:
файл, в принципе, может быть уже закрыт к началу печати...
Тоже верно. но тут срабатывает разгильдяйство юзеров, которые пока листочек из принтера не вылезет окно не закрывают, а иногда вообще о нем забывают.
I'm learning to live...

Последний раз редактировалось Stilet; 29.02.2008 в 17:00.
Stilet вне форума Ответить с цитированием
Старый 29.02.2008, 17:49   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Сопоставление фалов процессу это да, не подарок, я помнится делал что-то похожее с NtQuerySystemInformation и потом наверху через ObQueryNameString. Если вспомню как или не убил и найду, выложу, но в любом случае, придется "наверх" лезть. Хотя.. мне кажется, что Руссинович знает еще какой-то способ, Process Explorer вроде бы даже с задушеным драйвером хэндлы расписывает.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из процесса получить полный путь к ехе файлу. Ozerich Общие вопросы Delphi 4 08.08.2008 12:12
Как узнать полный путь к *.ехе файлу SeЯgey Помощь студентам 3 27.05.2008 09:46
Путь к файлу Terran Общие вопросы Delphi 3 13.04.2008 01:18
Функция CallWndProc. Получить путь к папке или файлу к которому преднозначено сообщение Irat Помощь студентам 1 16.02.2008 23:36
как в memo выводит полный путь к файлу? Файлом является данная программа. Alar Компоненты Delphi 0 29.10.2006 23:24