Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.10.2012, 13:14
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
Вопрос Обработка исключений при старте программы

Добрый день. Прошу помочь в таком вопросе. Написал небольшую програмку, которая использует функции доступные не во всех виндах (GDI+, - если не ошибаюсь начиная с ХP). Так вот, если этих компонент в винде нет - на старте возникает нечто типа "Application Еггог: Класс не зарегистрирован". Ситуация осложнена тем, что на доступных мне системах такая ошибка не возникает, так что я ее даже получить толком не могу.
И так вопрос: как перехватить ошибку, определить какой именно библиотеки (класса) не хватает (может я ее с екзешником поставлять буду) и вывести удобоваримое сообщение типа "Сорри у вас не установлено то-то, обновите это".
Мануалы по try... except читал, более того использовал. Но не знаю как решить задачу в данном конкретном случае. Заранее спасибо за любую помощь
Ответить с цитированием
  #2  
Старый 03.10.2012, 14:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

это:

возникает при статической загрузке библиотеки:
Код:
function gg(): Boolean; stdcall; external 'Обработка.исключений';
а это:

при не зарегистрированом классе:
Код:
const
  g: TGUID = '{4545A291-1A5A-41C4-B92B-CBBE4CA24643}';
begin
  CreateComObject(g);
end;

первое лечится динамической загрузкой библиотеки с проверкой результата, второе регистрированием объекта.

на VirtualBox можно установить систему, на которой нет возможности проверить.
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 03.10.2012 в 14:14.
Ответить с цитированием
  #3  
Старый 03.10.2012, 16:12
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Спасибо за ответ. Значит это не библиотека... Идея VirtualBox интересна, но я как бы не могу предусмотреть все варианты где может быть запущен мой код , поэтому интересует нельзя ли перехватить "Класс не зарегистрирован" и выдать более развернутое сообщение, какой класс (может я бы понял что с этим делать дальше ).
Ответить с цитированием
  #4  
Старый 03.10.2012, 16:51
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вариантов много, как бит в байте:

Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure Oops(Sender: TObject; E: Exception); 
...
procedure TForm1.FormCreate(Sender: TObject);
const
  g: TGUID = '{EF5E2FDC-0E79-47BE-8B66-0D8982C7CE38}';
begin
  // вариант 1
  try
    CreateComObject(g);
  except
    on E: Exception do ShowMessage('У Вас Windows !правильная :)'#13#10+E.Message);
  end;
  // вариант 2
  Application.OnException:=Oops;
  CreateComObject(g);
end;

procedure TForm1.Oops(Sender: TObject; E: Exception);
begin
  ShowMessage('У Вас Windows !правильная :)'#13#10+E.Message);
end;
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 04.10.2012 в 08:40.
Ответить с цитированием
  #5  
Старый 03.10.2012, 18:23
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 297
Репутация: -1806
По умолчанию

Цитата:
Сообщение от Oreon
но я как бы не могу предусмотреть все варианты где может быть запущен мой код
а какая польза от твоего кода чтоб его запускать вообще ?
Ответить с цитированием
  #6  
Старый 03.10.2012, 21:40
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

NumLock, "неправильная" пишется слитно.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 04.10.2012, 12:36
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

NumLock
Прошу меня простить, но я либо не понял, либо понял только направление
1. Если пример показывает как получить расшифровку "E.Message", то это я знаю. Я не знаю где в каком месте правильно перехватить ошибку (Application.CreateForm или Application.Initialize в try... except ставить?) и не знаю как соотнести
Цитата:
---------------------------
У Вас Windows !правильная
Класс не зарегистрирован, ClassID: {EF5E2FDC-0E79-47BE-8B66-0D8982C7CE38}
---------------------------
OK
---------------------------
с собственно какой клас и где искать (каких компонентов не хватает)
2. Если же пример следует разуметь буквально, то тогда совершенно не понимаю зачем мне создавать Com-объект, который кстати и создает ошибку выше...?

Последний раз редактировалось Oreon, 04.10.2012 в 12:39.
Ответить с цитированием
  #8  
Старый 04.10.2012, 12:44
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Цитата:
Сообщение от robt
а какая польза от твоего кода чтоб его запускать вообще ?
С удовольствием бы подискутировал на тему уникальности и глобальной полезности моего кода , но по-моему, это несколько выходит за рамки темы форума. А если я ее, эту тему, создавал, то наверно некоторые предпосылки к этому имеются.
Ответить с цитированием
  #9  
Старый 04.10.2012, 13:03
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Oreon
Я не знаю где в каком месте правильно перехватить ошибку
в том, где она может произойти. пример как раз это и показывает: создание незарегистрированого объекта вызывает исключение, которое и обрабатывается, выводя "нормальное" сообщение.
Цитата:
Сообщение от Oreon
где искать (каких компонентов не хватает)
у себя в программе.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 04.10.2012, 13:38
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
пример как раз это и показывает: создание незарегистрированого объекта вызывает исключение
1. Дело в том, что я у себя ничего такого не создаю (ну или не подозреваю об этом))). Я просто пользую библиотеку GdiPlus.dll которая входит в стандартную инсталяцию ХР и выше. При чем она не используется на старте, а ошибка именно препятствует запуску программы.
Попробовал удалить библиотеку из системы. Получаю ошибку третьего вида (первых 2 вы приводили в качестве примера): "Ошибка инициализации приложения (0xc0000034). Для выхода из приложения нажмите кнопку "ОК"". При чем перехватить у меня ее не получается.
2.
Цитата:
Сообщение от NumLock
у себя в программе.
На моей конфигурации как раз все нормально, а на 2000, например нет. может на 64-битной тоже не все в порядке, как красиво и информативно вывести сообщение об ошибке при запуске? Я думаю что проблема с GdiPlus.dll (с ее отсутствием или версией), а возможно с Microsoft Visual C++ Runtime Library или еще с чем. Не знаю как универсально решить проблему...
Ответить с цитированием
  #11  
Старый 04.10.2012, 15:03
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Oreon
Я просто пользую библиотеку GdiPlus.dll которая входит в стандартную инсталяцию ХР и выше. При чем она не используется на старте, а ошибка именно препятствует запуску программы.
тогда, скорее всего, у тебя 1-ый вариант проблемы (см. 2-ой пост).
как ты ее загружаешь? статически или динамически?
при статической загрузке, даже если обращение к ее функциям идет когда-то там..., будет ошибка, если она не найдена.
решение:
Цитата:
Сообщение от NumLock
лечится динамической загрузкой библиотеки с проверкой результата
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 04.10.2012 в 15:07.
Ответить с цитированием
  #12  
Старый 04.10.2012, 15:50
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
как ты ее загружаешь? статически или динамически?
никак, пользую через делфовую обертку uses GDIPAPI, GDIPOBJ, GDIPUTIL
PS: просмотрел их код - вызовов подобных CreateComObject или CreateOleObject не нашел, зато нашел "uses ActiveX,", в этом может проблема, но вопрос остается - как корректно и информативно отловить и обработать ошибку?
PPS: нашел, буквально так:
Код:
const WINGDIPDLL = 'gdiplus.dll';

Последний раз редактировалось Oreon, 04.10.2012 в 16:07.
Ответить с цитированием
  #13  
Старый 04.10.2012, 16:36
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Oreon
никак
так не бывает
Цитата:
Сообщение от Oreon
пользую через делфовую обертку uses GDIPAPI, GDIPOBJ, GDIPUTIL
а говоришь никак. надо было посмотреть туда. там статическая загрузка. т.е. если библиотеки не будет в системе, то будет появляться окно с ошибкой и его НИКАК не отловить. оно еще до begin в .dpr вылезает.
решение уже пишу в третий раз: динамически загружай библиотеку.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 04.10.2012, 17:10
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
решение уже пишу в третий раз: динамически загружай библиотеку.
Просто у меня мало опыта по работе с библиотеками , если библиотека грузится const WINGDIPDLL = 'gdiplus.dll'; в чужом модуле, как мне ее загрузить динамически и так чтобы я все таки пользовал обертку, а не переопределял сам функции?
Цитата:
Сообщение от NumLock
если библиотеки не будет в системе, то будет появляться окно с ошибкой и его НИКАК не отловить. оно еще до begin в .dpr вылезает.
Действительно я его пробовал там отловить - ошибка вылезает раньше.
Еще раз спасибо за помощь.
Ответить с цитированием
  #15  
Старый 04.10.2012, 18:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

боюсь что придется отказаться от этих модулей и создать свой. хотя бы не все функции переделать, а только те которые используются. читай про LoadLibrary и GetProcAddress. вот еще почитай http://www.helloworld.ru/texts/comp/.../dll/index.htm
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Oreon (04.10.2012)
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:27.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025