DLL - это общая библиотека. Это объект уровня ОС - любой процесс может загружать DLL и функции вызова, определенные в нем.
Элемент управления ActiveX - это COM-объект, который реализует определенные интерфейсы, которые позволяют хостам вызывать его методы и вставлять их в свой интерфейс. Существуют определенные минимальные требования, по которым интерфейсы, которые должен реализовать элемент управления ActiveX, должны быть успешно внедрены в пользовательский интерфейс приложения. Поскольку объекты COM обычно динамически загружаются процессом, они реализуются как DLL. Одна DLL может реализовать один класс COM или более.
Что касается исключений - я не уверен, какие различия вы наблюдали, но функция не отличается от функции, реализованной в основном файле .EXE вашего процесса. Исключенное в нем исключение должно распространяться в соответствии с правилами, определенными средой выполнения вашего языка программирования.
Метод ActiveX отличается. Как правило, он вызывается через что-то, называемое интерфейсом IDispatch. Вместо того, чтобы быть простым вызовом подпрограммы, он вызывается вызовом метода в интерфейсе IDispatch (IDispatch :: Invoke), причем его аргументы сортируются определенным образом (по сути, они преобразуются в стандартные типы и упаковываются таким образом, что скрываются различия в вызовах конвенций и типов данных между языком реализации основного процесса и элементом управления ActiveX.) Интерфейс IDispatch :: Invoke затем определяет, какой метод в ActiveX вызывающий пытается получить доступ, и направляет его напрямую.
Исключения, как правило, не распространяются через интерфейс IDispatch. Как ваша среда выполнения имеет дело с кодами ошибок, возвращаемыми IDispatch :: Invokeis, чтобы разработчик решал, действительно. Таким образом, вы можете разумно ожидать, что ваши ожидания не будут удовлетворены при работе с ошибками во время выполнения и исключениями, внесенными в элемент управления ActiveX.
. Я установил этот ответ как правильно, в соответствии со следующим: * То, что я испытал, заключается в том, что исключение .LLL вызывается обычным образом, но исключение .OCX не зацепилось. * Я попытался использовать try ... catch blocks, обработчики Application.ThreadException, обработчики AppDomain.CurrentDomain.UnhandledException и каждое значение в Application.SetUnhandledExceptionMode, поэтому я думаю, что исключение OCX не распространяется через интерфейс IDispatch. – 2010-01-26 11:08:03