![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Волод |
|
||||
|
Unregistered |
Всем привет!
Изучал на днях функцию EnumPrinters, и столкнулся с непонятным глюком (глюками!!!) при использовании этой функции. В качестве примера я использовал скелет Windows-окна, в который добавил обработку сообщения WM_LBUTTONDOWN, и при обработке этого сообщения вызывал функцию GetPrinterDC():
//2 если в начале функции структуру PRINTER_INFO_5 сделать статичной, ошибка (исключение) исчезает. static PRINTER_INFO_5 pinfo5[3]; //далее все работает нормально //3 если функцию GetPrinterDC вынести в отдельный файл, появляется новая ошибка – на этот раз на строке cc=new int. Причем выделить память под указатель не получается никоим образом. Например, не срабатывает и такой выриант написания: cc=(int*)malloc(sizeof(int)); //4 еще один глюк (я пока не смог точно отловить, как он проявляется ), заключается в следующем: если в начале работы программы создать глобальную переменную описатель экземпляра – что-то типа hInst = hInstance, то иногда при втором вызове EnumPrinters он неожиданно меняет свой адрес… Я на этот глюк так вышел: вызываб два раза EnumPrinters (заполняю PRINTER_INFO структуру принтерами), затем создаю диалоговое окно отмены печати CreateDialog(hInst…), а диалог-то и не создаю. Стал смотреть через отладчик и нарыл эту аномалию – при вызове EnumPrinters hInst вдруг поменял адрес…. На всякий случай поясню, зачем мне все это надо… Дочитываю потихоньку второй том Петзольда. Читаю вдумчиво, медленно, хочется во всем разобраться – а не оставлять белых пятен "на потом", так что вопрос для меня принципиальный…. Сама функция упрощена до предела: - поэтому ничего и не возвращает. А в оригинале после создания/заполнения структуры PRINTER _INFO из функции возвращается созданный на основе элемента этой структуры контекст – вот так: return CreateDC(NULL, pinfo5[0].pPrinterName, NULL, NULL); |
||||
|
|||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
1) Зачем создаешь динамическую переменную, если ее а) не удаляешь; б) не используешь
2) Ну, она и должна быть либо статикой, либо глобальной 3) Что компилер пишет-то? если что, то см п1. 4) Без всего кода не разобраться. Кроме того: первый вызов EnumPrinters - неправильный, например, cbBuf - размер в байтах массива. Тоже и во втором. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |