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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2017, 11:19   #1
Dagmanor
Пользователь
 
Регистрация: 26.02.2014
Сообщений: 26
Вопрос Получение информации _PRINTER_INFO_5 о принтере

Здравствуйте.
Понадобилось разделить принтеры в системе по принципу локальный/сетевой. пробую делать так:

Код:
  
var
  i: Integer;
  p: P_PRINTER_INFO_5;
  ABytesNeeded: DWord;
  PH:THandle;
begin
  ListBox1.Items.Clear;
  ListBox2.Items.Clear;
  for i := 0 to Printer.Printers.Count - 1 do
  begin

    ph:=0;
    OpenPrinter(PWideChar(Printer.Printers[I]),PH,nil);
    if PH<>0 then
    begin
      GetPrinter(PH, 5, nil, 0, @ABytesNeeded);
      GetMem(p,ABytesNeeded);
      GetPrinter(PH, 5, p, ABytesNeeded, @ABytesNeeded);
      if getlasterror <> 0 then
        raiselastoserror;

      if ((p^.Attributes and PRINTER_ATTRIBUTE_LOCAL) <> 0) then
      begin
          //если он локальный
        ListBox1.Items.add(p^.pPrinterName+' | '+ p^.pPortName);
      end
      else
        ListBox2.Items.add(p^.pPrinterName+' | '+ p^.pPortName);

      FreeMem(p);
    end;
    ClosePrinter(ph);
  end;
end;
( P_PRINTER_INFO_5 = ^_PRINTER_INFO_5; )


Но постоянно получаю ошибку:
"System Error. Code: 122.
Область данных, переданная по системному вызову, слишком мала."

Подскажите, пожалуйста, что делаю не так?
Dagmanor вне форума Ответить с цитированием
Старый 23.08.2017, 11:31   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

OpenPrinter вторым параметром берет указатель на хендл, на сколько я помню в делфи тхендл это просто хендл.
p51x вне форума Ответить с цитированием
Старый 23.08.2017, 11:35   #3
Dagmanor
Пользователь
 
Регистрация: 26.02.2014
Сообщений: 26
По умолчанию

вот описание OpenPrinter:
Код:
function OpenPrinter(pPrinterName: LPWSTR; var phPrinter: THandle; pDefault: PPrinterDefaults): BOOL; stdcall;
Вроде как и не указатель.
Dagmanor вне форума Ответить с цитированием
Старый 23.08.2017, 11:42   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Все. Вспомнил про вар параметры. Тогда у вас один путь пока: крутить цикл и перевыделять память пока не хватит.

Кстати, посмотрите что в ABytesNeeded возвращается.

Последний раз редактировалось p51x; 23.08.2017 в 11:45.
p51x вне форума Ответить с цитированием
Старый 23.08.2017, 11:51   #5
Dagmanor
Пользователь
 
Регистрация: 26.02.2014
Сообщений: 26
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Все. Вспомнил про вар параметры. Тогда у вас один путь пока: крутить цикл и перевыделять память пока не хватит.

Кстати, посмотрите что в ABytesNeeded возвращается.
в ABytesNeeded возвращаются разные значения в зависимости от принтера (80,96,112)
Dagmanor вне форума Ответить с цитированием
Старый 23.08.2017, 11:57   #6
Dagmanor
Пользователь
 
Регистрация: 26.02.2014
Сообщений: 26
По умолчанию

решил проблему выделением заведомо достаточного количества памяти:
Код:
      GetMem(p,10240);
      GetPrinter(PH, 5, p, 10240, @ABytesNeeded);
Спасибо большое за ответы.
Dagmanor вне форума Ответить с цитированием
Старый 23.08.2017, 12:19   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

И когда-нибудь оно упадет, делайте как положено цикл.
p51x вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Qt] Получение информации с сайта Pixelrom33 Qt и кроссплатформенное программирование С/С++ 6 03.01.2018 16:24
Получение информации о процессе RibGeDx Visual C++ 2 13.04.2013 14:09
Получение информации о принтере mutabor Общие вопросы Delphi 4 17.05.2011 16:37
Получение информации из мр3 GAGARIN-NEW Мультимедиа в Delphi 2 24.03.2008 15:19
Получение информации о классе Sibedir Общие вопросы Delphi 7 07.12.2007 14:37