Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как обработать Exception при загрузке DLL


Автор: Gershkovich 27.9.2007, 15:03
Всем привет!

Пишу плагин для Winamp-a.

В секции инициализации юнита создаю объект:

Код

initialization
  try
    Scaner:= TScaner.Create;

  except
    on E : Exception do begin
      LastError:= E.Message;
    end;
  end;


Конструктор TScaner.Create выбрасывает эксепшн.
Я специально сам выбрасываю этот эксепшн - чтоб просто протестировать
как все будет работать в таком случае.

В итоге при загрузке Winamp-a стабильно - синий экран смерти...

Пробовал поместить этот код в метод Init (который вызывается Winamp-ом) -
результат тот же.

Что я неправильно делаю ?

Заранее спасибо.

Автор: dumb 27.9.2007, 16:01
Цитата(Gershkovich @  27.9.2007,  16:03 Найти цитируемый пост)
В итоге при загрузке Winamp-a стабильно - синий экран смерти...
smile это явно перебор. винамп - user-mode приложение, и ни при каких ошибках в нем синий экран не должен возникать.
эксепшн ты отлавливаешь, все должно быть нормально. это какой-то баг, причем где именно - непонятно.

Автор: Rrader 27.9.2007, 16:11
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1201

Автор: ama_kid 27.9.2007, 16:30
Gershkovich, попробуй проверить, что возникает именно то исключение, которое ты выбрасываешь, а не какое-то другое. Может у тебя в конструкторе какая-то ошибка непроизвольная возникает? Еще как вариант - убери исключение из конструктора и создай отдельный метод, который будет его бросать, типо:
Код
  try
    Scaner:= TScaner.Create;
    Scanner.ThrowMyOwnException;
  except
    on E : Exception do begin
      LastError:= E.Message;
    end;
  end;
Ну и на закуску - вот что пишет хелп дельфи по слову raise:
Цитата
Note
Raising an exception in the initialization section of a unit may not produce the intended result. Normal exception support comes from the SysUtils unit, which must be initialized before such support is available. If an exception occurs during initialization, all initialized units--including SysUtils--are finalized and the exception is re-raised. Then the exception is caught and handled, usually by interrupting the program. Similarly, raising an exception in the finalization section of a unit may not lead to the intended result if SysUtils has already been finalized when the exception has been raised.
Может это тоже как-то связано?

Автор: Gershkovich 28.9.2007, 09:50
Разобралсо !
Winamp ни причом

Я не до конца разобралсо  с параметрами CreateFileMapping
Вот фатальный фрагмент:
Код

  Size : DWord = 1024;

  // create memory mapped file with size 1024 bytes
  MappingHandle := CreateFileMapping(
                        $FFFFFFFF,
                        nil,
                        PAGE_READWRITE,
                        Hi(Size),  // Здесь неправильно !
                        Lo(Size), // И здесь неправильно !
                        'bla-bla-bla');



Вот правильный код
Код

  // create memory mapped file with size 1024 bytes
  MappingHandle := CreateFileMapping(
                        $FFFFFFFF,
                        nil,
                        PAGE_READWRITE,
                        0,  // Правильно !
                        Size, // Правильно !
                        'bla-bla-bla');



Всем спасибо за хинты!

Автор: dumb 28.9.2007, 10:59
Цитата(Gershkovich @  28.9.2007,  10:50 Найти цитируемый пост)
не до конца разобралсо  с параметрами CreateFileMapping
хорошо, что разобралсо. но это все равно очень странно, что оно тебя в бсод отправляло... smile

Автор: Gershkovich 28.9.2007, 12:19
dumb, Не хочешь у себя проверить ?
Могу выслать исходнеки, если хочешь.

Автор: W4FhLF 28.9.2007, 12:59
Gershkovich, выложи здесь.

Автор: Gershkovich 28.9.2007, 13:30
Here you are

Автор: W4FhLF 28.9.2007, 14:03
Всё ок.


Цитата(Gershkovich @  28.9.2007,  13:30 Найти цитируемый пост)
Here you are


"Here it is" ты хотел сказать smile

Автор: Gershkovich 28.9.2007, 17:31
Цитата(W4FhLF @  28.9.2007,  14:03 Найти цитируемый пост)
Всё ок.


В смысле у тебя все работает ?
Не падает ?

Может ты не поменял параметры ?
там щас правильные стоят.

А надо поставить 
Lo(Size) и Hi(SIze) какя описывал выше


ЗЫ 
 Here you are = Пожалусто

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)