2010-01-21 3 views
1

Я знаю, что (vC++) ocx - это элемент управления ActiveX, а dll (vC++) - это набор функций. Я обнаружил, что, будучи вызванным из приложения vb.net, улавливание некоторых исключений может вести себя по-другому, если исключение выбрасывается изнутри ocx или внутри функции, которая поступает в dll.Различия в обработке исключений OCX и DLL?

Так что мой вопрос: С точки зрения приложения VB.net, в чем основные отличия между использованием .ocx-файлов и использованием DLL-файлов?

ответ

2

DLL - это общая библиотека. Это объект уровня ОС - любой процесс может загружать DLL и функции вызова, определенные в нем.

Элемент управления ActiveX - это COM-объект, который реализует определенные интерфейсы, которые позволяют хостам вызывать его методы и вставлять их в свой интерфейс. Существуют определенные минимальные требования, по которым интерфейсы, которые должен реализовать элемент управления ActiveX, должны быть успешно внедрены в пользовательский интерфейс приложения. Поскольку объекты COM обычно динамически загружаются процессом, они реализуются как DLL. Одна DLL может реализовать один класс COM или более.

Что касается исключений - я не уверен, какие различия вы наблюдали, но функция не отличается от функции, реализованной в основном файле .EXE вашего процесса. Исключенное в нем исключение должно распространяться в соответствии с правилами, определенными средой выполнения вашего языка программирования.

Метод ActiveX отличается. Как правило, он вызывается через что-то, называемое интерфейсом IDispatch. Вместо того, чтобы быть простым вызовом подпрограммы, он вызывается вызовом метода в интерфейсе IDispatch (IDispatch :: Invoke), причем его аргументы сортируются определенным образом (по сути, они преобразуются в стандартные типы и упаковываются таким образом, что скрываются различия в вызовах конвенций и типов данных между языком реализации основного процесса и элементом управления ActiveX.) Интерфейс IDispatch :: Invoke затем определяет, какой метод в ActiveX вызывающий пытается получить доступ, и направляет его напрямую.

Исключения, как правило, не распространяются через интерфейс IDispatch. Как ваша среда выполнения имеет дело с кодами ошибок, возвращаемыми IDispatch :: Invokeis, чтобы разработчик решал, действительно. Таким образом, вы можете разумно ожидать, что ваши ожидания не будут удовлетворены при работе с ошибками во время выполнения и исключениями, внесенными в элемент управления ActiveX.

+0

. Я установил этот ответ как правильно, в соответствии со следующим: * То, что я испытал, заключается в том, что исключение .LLL вызывается обычным образом, но исключение .OCX не зацепилось. * Я попытался использовать try ... catch blocks, обработчики Application.ThreadException, обработчики AppDomain.CurrentDomain.UnhandledException и каждое значение в Application.SetUnhandledExceptionMode, поэтому я думаю, что исключение OCX не распространяется через интерфейс IDispatch. – 2010-01-26 11:08:03

1

Нет никакой разницы. Это обе библиотеки. Вы можете переименовать dll на что угодно и все еще загружать и использовать его с помощью LoadLibrary, GetProcAddress.

+1

Хотя технически правильно, (OCX - это DLL), это не очень полезный ответ. Элемент управления ActiveX предоставляет свой интерфейс через интерфейс IDispatch, к которому вы не можете получить доступ через GetProcAddress(). Во всяком случае, это не так. –

0

В мире .net dll не является набором функций. Это сборка, которая представляет собой набор типов — классы и модули. Эти типы, вероятно, также содержат функции, но это другой уровень абстракции.

Но поскольку вы говорите об этом в сочетании с ocx-файлами, я дам, что, возможно, вы ссылаетесь на DLL, созданную vb6, поскольку .Net не имеет ничего общего с ocx-файлами или элементами управления activex непосредственно. В этом случае они оба являются только COM-объектами, которые вы можете загрузить.

+1

DLL не является COM-объектом. Он может реализовывать COM-объект или несколько COM-объектов или none. –

+0

Предоставлено, но dll, созданный vb6 и использующийся на том же дыхании, что и ocx, почти всегда есть. –

+0

Вопрос теперь отредактирован и говорит, что это VC++ DLL, поэтому они могут быть COM-DLL или обычными старыми DLL-файлами. По-прежнему кажется вероятным, что они являются COM-библиотеками, поскольку они упоминаются на одном дыхании, как VC++ OCX. – MarkJ

3

. .ocx содержит COM-классы, которые следуют договору автоматизации OLE. Этот контракт имеет четко определенный способ возврата ошибок клиенту. Каждый метод возвращает HRESULT, код, который указывает, был ли метод успешным или нет. Это простое целое число, коды ошибок определены в файле заголовка WinError.h SDK. Он также поддерживает получение контекстной информации об ошибке через интерфейс IErrorInfo. Поддержка COM-взаимодействия в среде CLR гарантирует, что код отказа будет переведен в сравнимое исключение.

Нет такого стандарта для кода в C/C++ DLL. Если это вообще исключает исключение, это почти всегда что-то неприятное, как AccessViolation. Маршаллер P/Invoke гарантирует, что эти исключения пойманы и переведены. Из такого исключения вы всегда получите очень мало полезной информации, кроме «это не сработало». Вы должны позволить этим исключениям прекратить свою программу, вы не сможете осмысленно восстановить ее.

+0

+1 Это лучшее объяснение ИМХО. Хотя C/C++ DLL все еще может быть COM-DLL, вопрос не совсем ясен об этом – MarkJ

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

  • Нет связанных вопросов^_^