Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача указателя на структуру в API, нужно разобраться как делается 
V
    Опции темы
BpIstorick
  Дата 25.7.2006, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



Столкнулся с проблемой, что не знаю как передать указатель (Pointer) на структуру в API функция

Ситуация:

Есть функция 
Код

BOOL GetPrinter(
  HANDLE hPrinter,    // handle to printer
  DWORD Level,        // information level
  LPBYTE pPrinter,    // printer information buffer
  DWORD cbBuf,        // size of buffer
  LPDWORD pcbNeeded   // bytes received or required
);


в которую передается указатель на структуру pPrinter, ради получания информации о принтере!

Проблема:

не могу инициализировать  smile  структуру pPrinter, функция не выполняется, а GetLastError выдает сообщение о том, что я неправильный указатель на структуру предоставил (ошибка 1780 если интересно)

Цель:

научите меня эти структуры инициализировать, хочу понять, чтоб не только эту функцию мог выполнить, но и с другими все получилось, лучше сами но если пошлете на книгу или статью, то всирано спасиб!  smile  
PM MAIL   Вверх
BUGOR
Дата 25.7.2006, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 2
Всего: 16



Цитата

The GetPrinter function retrieves information about a specified printer. 

BOOL GetPrinter(

    HANDLE hPrinter,    // handle to printer of interest 
    DWORD Level,    // version of printer info data structure 
    LPBYTE pPrinter,    // pointer to array of bytes that receives printer info. structure 
    DWORD cbBuf,    // size, in bytes, of array of bytes 
    LPDWORD pcbNeeded  // pointer to variable with count of bytes retrieved (or required) 
   );    
 

Parameters

hPrinter

Handle to the printer of interest. 

Level

Specifies the level, or type, of PRINTER_INFO_* structure that the function stores into the buffer pointed to by pPrinter. 
Windows 95: This value can be 1, 2, or 5.
Windows NT: This value can be 1, 2, 3, 4, or 5. 

pPrinter

Pointer to a buffer that receives a PRINTER_INFO_* structure. This structure contains information about the specified printer. The type of structure is determined by the value of Level. 
Windows 95: The buffer can receive a PRINTER_INFO_1, PRINTER_INFO_2, PRINTER_INFO_5 structure.
Windows NT: The buffer can receive a PRINTER_INFO_1, PRINTER_INFO_2, PRINTER_INFO_3, PRINTER_INFO_4, or PRINTER_INFO_5 structure.

cbBuf

Specifies the size, in bytes, of the buffer pointed to by pPrinter. 

pcbNeeded

Pointer to a variable that the function sets to the size in bytes of the printer information. If cbBuf is smaller than this value, GetPrinter fails, and the value represents the required buffer size. If cbBuf is equal to or greater than this value, GetPrinter succeeds, and the value represents the number of bytes stored into the buffer.


Сами структуры PRINTER_INFO без особого труда найдёшь в C:\Program Files\Borland\Delphi6\Source\Rtl\Win\WinSpool.pas
Надеюсь из этого описания всё понятно? Это не указатель на структуру, это указатель на байтовый массив, который будет хранить в себе структуру, вообщем читай описания, там всё подробно описано. 


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
BpIstorick
Дата 25.7.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



BUGOR, 

Я знаю на какую структуру мне нужно передать указатель, я не знаю как правильно это сделать
 все эти функции я успешно нашел в MSDN, собственно оттуда я и взял описание функции GetPrinter для своего вопроса smile , мне хочется узнать не конкретный случай, а именно подход!

Код

Pointer to a buffer that receives a PRINTER_INFO_* structure. 
This structure contains information about the specified printer. The type of structure is determined by the value of Level. 


то есть указатель на буффер "a PRINTER_INFO_* structure", то есть буффер болжен быть просто массивом байт нужного размера (допустим buffer: array [0..Size] of byte), а потом мы передаем этот буфер соответствующей структуре или buffer должен быть сразу типа PPrinterInfo2? в DRKB есть пример как добавить принтер с помощью API функции AddPrinter, 

НО мы сами создаем в этом примере и заполняем структуру

А МНЕ НУЖНО ПОЛУЧИТЬ структуру из GetPrinter  smile 

p.s. повторю что мне интересен подход и методика, чтобы в будущем не спрашивать по каждой функции разъяснений ;) 
PM MAIL   Вверх
Alexeis
Дата 25.7.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



что-то вроде этого.
Код

var
  p          :  TPrinterInfo1;
  NewStrSize : Cardinal;
begin
  P.Flags := ...;
  P.pDescription := 'что-то там';
  p.pName := 'еще что нибудь';
  p.pComment := 'что угодно';
  GetPrinter(<Handle принтера>, 1, @P, SizeOf(p), NewStrSize);
end;


Цитата(BpIstorick @  25.7.2006,  10:32 Найти цитируемый пост)
А МНЕ НУЖНО ПОЛУЧИТЬ структуру из GetPrinter


Так в P мы получим и результат, который уже будет иметь размер NewStrSize

Добавлено @ 11:00 
Т.е. это уже будет другая структура с другими данными. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
BpIstorick
Дата 25.7.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



т.е. нам нужно как бы инициализировать каждое поле записи типа TPrinterInfo1 (или любой другой нужной). попробую smile отпишусь по результатам.

А если Тип состоит из 30 и до бесконечности количества полей, то нужно будет каждое инициализировать отдельно??? 
PM MAIL   Вверх
BpIstorick
Дата 25.7.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



Нашел ответ опять же в DRKB, статья называется "Как изменить порт для принтера?" (хотя там подобного материала как оказалось навалом, просто или не попадалось на глаза, или не обращал внимание)

код, написанный мной для проверки работает и выглядит следующим образом smile

Код

procedure TForm1.btnGetInfoClick(Sender: TObject);
var
  pInfo: PPrinterInfo2;
  pHandle: THandle;
  need: DWord;
begin
  OpenPrinter ('Принтер Samsung ML-1210', pHandle, nil);
  label1.Caption:= inttostr (pHandle);
  GetPrinter (pHandle, 2, nil, 0, @need);
  Label2.Caption:= InttoStr (need);
  pInfo:= AllocMem (need);
  GetPrinter (pHandle, 2, pInfo, need, @need);
  label3.Caption:='aa'+pInfo^.pPrinterName;
  label4.Caption:='aa'+pInfo^.pServerName;
  label5.Caption:='aa'+pInfo^.pShareName;
  label6.Caption:='aa'+pInfo^.pPortName;
  label7.Caption:='aa'+pInfo^.pDriverName;
  label8.Caption:='aa'+pInfo^.pPrintProcessor;
  FreeMem (pInfo);
end;


как оказалось все просто и непросто (если не знаешь как делать smile )

1. первым вызовом получаем необходимое количесвто байт по структуру pInfo
2. выделяем необходимое количество байт
3. получаем саму структуру smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.