C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
PRINTER_INFO_2, Access violation at address 777D438E in
** Pan-SQL
Отправлено: 16.11.2005, 11:49


Не зарегистрирован







Здравствуйте! Вот начал изучение программной организации вывода информации на принтер (печати). Решил программно получить информацию о принтере (имя, драйвер, порт и т.д.). В книжке прочитал про структуру PRINTER_INFO_2. Из этой же книжки набрал следующий пример программного кода:

HANDLE hPrinter; // Дескриптор принтера
PRINTER_DEFAULTS pd;
DWORD dwNeeded; // Размер структуры PRINTER_INFO_2 в байтах
PRINTER_INFO_2 *Pinfo2; // Указатель на структуру PRINTER_INFO_2 в байтах
// Инициализирую структуры принтера стандартными значениями
ZeroMemory(&pd, sizeof(PRINTER_DEFAULTS));
// Получаю полный доступ
pd.DesiredAccess=PRINTER_ALL_ACCESS;
// Открываю принтер
if (!OpenPrinter(Pinfo2->pPrinterName, &hPrinter, &pd));
ShowMessage("Ошибка вызова функции OpenPrinter()");
// Получаю размер структуры PRINTER_INFO_2
if (!GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded))
{
if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER)
{
ClosePrinter(hPrinter);
ShowMessage("Ошибка вызова функции GetPrinter()");
}
}
if (!GetPrinter(hPrinter, 2, (LPBYTE)Pinfo2, dwNeeded, &dwNeeded))
{
free(Pinfo2);
ClosePrinter(hPrinter);
ShowMessage("Ошибка вызова функции GetPrinter() 2");
}
if (!SetPrinter(hPrinter, 2, (LPBYTE)Pinfo2, 0))
{
ClosePrinter(hPrinter);
ShowMessage("Ошибка вызова функции GetPrinter()");
}
// Выделяю память для структуры
Pinfo2=(PRINTER_INFO_2*) malloc(dwNeeded);
if (Pinfo2==NULL)
{
ClosePrinter(hPrinter);
ShowMessage("Ошибка вызова функции GetPrinter()");
}
// Заполняю структуру информацией
if (!GetPrinter(hPrinter, 2, (LPBYTE)Pinfo2, dwNeeded, &dwNeeded))
{
free(Pinfo2);
ClosePrinter(hPrinter);
ShowMessage("Ошибка вызова функции GetPrinter() 2");

}
// Вывожу в метку PrinterName имя принтера
PrinterName->Caption=Pinfo2->pPrinterName;

При выполнение данного кода я получаю исключение:
Access violation at address 777D438E in module WINSPOOL.DRV. Read of address 4D89098B. Никак не могу понять, в чем дело. Работаю под Windows 2000. Если кто-нибудь знает выход из данной ситуации, поделитесь опытом. Заранее благодарю.
** Pan-SQL
Отправлено: 16.11.2005, 14:14


Не зарегистрирован







Неужели никто с этим не сталкивался? sad.gif

Вернуться в Вопросы программирования в C++Builder