![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день. Прошу помочь в таком вопросе. Написал небольшую програмку, которая использует функции доступные не во всех виндах (GDI+, - если не ошибаюсь начиная с ХP). Так вот, если этих компонент в винде нет - на старте возникает нечто типа "Application Еггог: Класс не зарегистрирован". Ситуация осложнена тем, что на доступных мне системах такая ошибка не возникает, так что я ее даже получить толком не могу.
И так вопрос: как перехватить ошибку, определить какой именно библиотеки (класса) не хватает (может я ее с екзешником поставлять буду) и вывести удобоваримое сообщение типа "Сорри у вас не установлено то-то, обновите это". Мануалы по try... except читал, более того использовал. Но не знаю как решить задачу в данном конкретном случае. Заранее спасибо за любую помощь |
#2
|
||||
|
||||
![]() это:
![]() возникает при статической загрузке библиотеки: Код:
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
|
|||
|
|||
![]() Спасибо за ответ. Значит это не библиотека... Идея VirtualBox интересна, но я как бы не могу предусмотреть все варианты где может быть запущен мой код
![]() ![]() |
#4
|
||||
|
||||
![]() вариантов много, как бит в байте:
Код:
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
|
|||
|
|||
![]() Цитата:
|
#6
|
||||
|
||||
![]() NumLock, "неправильная" пишется слитно.
![]() Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
![]() NumLock
Прошу меня простить, но я либо не понял, либо понял только направление ![]() 1. Если пример показывает как получить расшифровку "E.Message", то это я знаю. Я не знаю где в каком месте правильно перехватить ошибку (Application.CreateForm или Application.Initialize в try... except ставить?) и не знаю как соотнести Цитата:
2. Если же пример следует разуметь буквально, то тогда совершенно не понимаю зачем мне создавать Com-объект, который кстати и создает ошибку выше...? Последний раз редактировалось Oreon, 04.10.2012 в 12:39. |
#8
|
|||
|
|||
![]() Цитата:
![]() |
#9
|
||||
|
||||
![]() Цитата:
Цитата:
Пишу программы за еду. __________________ |
#10
|
|||
|
|||
![]() Цитата:
Попробовал удалить библиотеку из системы. Получаю ошибку третьего вида (первых 2 вы приводили в качестве примера): "Ошибка инициализации приложения (0xc0000034). Для выхода из приложения нажмите кнопку "ОК"". При чем перехватить у меня ее не получается. 2. Цитата:
|
#11
|
||||
|
||||
![]() Цитата:
как ты ее загружаешь? статически или динамически? при статической загрузке, даже если обращение к ее функциям идет когда-то там..., будет ошибка, если она не найдена. решение: Цитата:
Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 04.10.2012 в 15:07. |
#12
|
|||
|
|||
![]() Цитата:
PS: просмотрел их код - вызовов подобных CreateComObject или CreateOleObject не нашел, зато нашел "uses ActiveX,", в этом может проблема, но вопрос остается - как корректно и информативно отловить и обработать ошибку? PPS: нашел, буквально так: Код:
const WINGDIPDLL = 'gdiplus.dll'; Последний раз редактировалось Oreon, 04.10.2012 в 16:07. |
#13
|
||||
|
||||
![]() Цитата:
Цитата:
решение уже пишу в третий раз: динамически загружай библиотеку. Пишу программы за еду. __________________ |
#14
|
|||
|
|||
![]() Цитата:
![]() Цитата:
Еще раз спасибо за помощь. |
#15
|
||||
|
||||
![]() боюсь что придется отказаться от этих модулей и создать свой. хотя бы не все функции переделать, а только те которые используются. читай про LoadLibrary и GetProcAddress. вот еще почитай http://www.helloworld.ru/texts/comp/.../dll/index.htm
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Oreon (04.10.2012)
|