2013-04-23 3 views
2

Я сделал два активных компонента в Delphi XE2 в отдельных проектах. Один из компонентов работает отлично, и каждое исключение, которое он бросает, маскируется как EOleException. На другом компоненте activex исключения не замаскированы, они выбрасываются как их исходный тип. Клиент - это программа delphi XE.ActiveX не поднимает EOleException

Когда компонент activex генерирует исходное исключение, следующий вызов любого другого метода из компонента вызывает исключение нарушения доступа в местах, где он не должен, например, установка локальной строковой переменной со значением. Это очень странное поведение.

Я сравнивал оба проекта .ridl-файл, компилируя опции, .dproj-файл и не смог найти виновника.

Кто-нибудь знает причину этой разницы/странного поведения?

благодаря

Edit: Некоторый код

Компонент 1, который работает (маски все исключения в EOleException)

TspdMyClassX = class(TActiveXComponent, MyInterface) 

...

initialization 


TActiveXComponentFactory.Create(
    ComServer, 
    TspdMyClassX, 
    CLASS_spdMyClassX, 
    1, 
    '', 
    0, 
    tmBoth); 

Другой компонент, которые делают не выбрасывать EOleException имеют другой интерфейс, но остальная часть кода такая же (инициализация, родительский класс TActiveXComponent)

+0

Пожалуйста, покажите фактический код. –

+0

Вы сравнили порядок единиц, включенных в предложение 'uses'. Если два включенных файла обрабатывают исключения, то, возможно, он использует код из разных блоков между двумя проектами. Он использует код, который он находит первым, начиная с последнего блока в предложении 'uses' и отступая от него назад. –

+0

Я выяснил, что если я определяю метод, который не принимает никаких параметров и не имеет возвращаемого значения, компонент маскирует исключения, сгенерированные внутри метода с помощью EOleException. Когда метод имеет возвращаемое значение или параметр, исключение не маскируется. Я делаю тот же проект на delphi 7 из нуля, чтобы узнать, является ли это некоторой ошибкой, связанной с delphi xe2. –

ответ

1

Мне кажется, что проблема связана с Delphi XE2, сгенерированными файлами .ridl/.tlb. Я переработал компонент с помощью delphi 7, затем открыл проект в delphi xe2 и только скомпилировал/ввел его (без редактирования в .ridl, никаких изменений в TLB в delphi xe2). Все исключения были правильно маскированы с помощью EOleException, и проблема решена.

+0

После сравнения файлов с версией, разработанной в Delphi XE2, я заметил, что некоторые методы генерируются с помощью «stdcall» в xe2, а Delphi 7 генерирует все методы с помощью «safecall». –

+0

вот некоторая информация, которую я нашел в google http://www.delphipages.com/forum/showthread.php?t=86698 –

+0

по ссылке выше: «Соглашение safecall реализует COM-ошибку и обработку исключений». –

Смежные вопросы