![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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, "неправильная" пишется слитно.  
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	![]()  | 
| 
		 
			 
			#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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
   , если библиотека грузится const WINGDIPDLL = 'gdiplus.dll'; в чужом модуле, как мне ее загрузить динамически и так чтобы я все таки пользовал обертку, а не переопределял сам функции?Цитата: 
	
 Еще раз спасибо за помощь.  | 
| 
		 
			 
			#15  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 боюсь что придется отказаться от этих модулей и создать свой. хотя бы не все функции переделать, а только те которые используются. читай про LoadLibrary и GetProcAddress. вот еще почитай http://www.helloworld.ru/texts/comp/.../dll/index.htm 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
 
Oreon (04.10.2012)
  | ||