Различия в обработке исключений OCX и DLL? - PullRequest
1 голос
/ 21 января 2010

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

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

Ответы [ 4 ]

3 голосов
/ 21 января 2010

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

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

2 голосов
/ 21 января 2010

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

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

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

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

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

1 голос
/ 21 января 2010

Разницы нет. Они оба DLL. Вы можете переименовать dll во что угодно, но при этом загрузить и использовать ее, используя LoadLibrary, GetProcAddress.

0 голосов
/ 21 января 2010

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

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

...