Есть ли способ передать ссылку управления OCX из DLL ActiveX Visual Basic 6 через COM-взаимодействие? - PullRequest
1 голос
/ 01 марта 2011

Я наткнулся на это, пытаясь построить ActiveX dll из старых (но все еще сохраняемых) VB6 exe project (*) источников, чтобы выполнить некоторое тестирование с помощью COM / NET взаимодействия.

(желаемый) вариант использования:

  1. Возьмите класс VB6 с открытыми методами, получающими или возвращающими некоторую контрольную (например, CommonDialog) ссылку
  2. CompileЭтот класс в ActiveX DLL
  3. Создайте экземпляр этого класса через COM-взаимодействие из .NET и правильно вызывайте его методы

Короче говоря,Первая проблема заключается в том, что наличие в файле класса Visual Basic 6 ActiveX dll чего-то вроде

Public Function bad_dlg() As CommonDialog
   Set bad_dlg = Nothing
End Function

приводит к сбою компиляции (* *) со следующей ошибкой:

«Модули закрытых объектов нельзя использовать в модулях открытых объектов в качестве параметров или типов возврата для открытых процедур, в качестве открытых элементов данных или в качестве полей открытых пользовательских типов»

Следовательно,вопрос:

  1. действительно ли это невозможночтобы что-то вроде выше скомпилировалось и работало правильно?
  2. [ЕСЛИ НЕТ] Предположим, я изменяю все, чтобы возвращать и получать экземпляры типа VB6 Object - как я могу работать с таким экземпляром из.Net (вызов конкретных методов и т. Д.)

(*) - не ActiveX exe, а просто "обычный"

(* *) при условии, что соответствующая .ocx («Microsoft Common Dialog Control 6.0 (SP6)», C: \ Windows \ system32 \ ComDlg32.OCX) указана

(* * *) единственной, котораяЯ нашел это Передача управления Ссылка на DLL

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

(что касается 1-й части вопроса)

Документация Microsoft ( Типы данных, разрешенные в свойствах и методах) ) говорится:

О зле возвращающихся частных объектов

Следующие типы данных недопустимы, и ссылки на них никогда не следует возвращать клиентским приложениям:

  • Все объекты, представленные в библиотеке объектов Visual Basic (VB) - например, элементы управления. Используйте Обозреватель объектов для просмотра всего списка.

  • Все формы.

  • Все модули классов, для которых свойство Instancing имеет значение Private.

  • Ссылки на элементы управления ActiveX.

Visual Basic предотвращает передачу невизуальных частных объектов в компоненты вне процесса или из них. Попытка сделать это приводит к ошибке 98, «Вызов свойства или метода не может включать ссылку на частный объект, либо в качестве аргумента, либо в качестве возвращаемого значения.» Эта ошибка всегда принимается клиентом.

...

ВАЖНО

  • Частные объекты являются частными по определенной причине, обычно потому, что они не были предназначены для использования вне вашего проекта. Передача их клиенту может снизить стабильность программы и привести к несовместимости с будущими версиями Visual Basic. Если вам необходимо передать клиенту собственный закрытый класс, установите для свойства Instancing значение, отличное от Private.

[ Deatails follow ]

1 голос
/ 01 марта 2011

Не могу помочь с 1, но 2 должно быть возможно в DotNet 4.0 с динамическим ключевым словом.

...