Это может быть очень просто или несколько сложно в зависимости от синтаксиса, который вам необходим.
Один из способов - создать собственную коллекцию имен / значений в элементе управления ActiveX.
Вы можете добавить только два метода:
HRESULT GetPropery([in] BSTR name, [out,retval] VARIANT value);
HRESULT SetPropery([in] BSTR name, [in] VARIANT value);
По сути, у вас будет ОДНО свойство на элементе управления, который будет содержать коллекцию всех остальных. Это самый простой способ.
Вместо этого можно создать свойство com collection (ссылка предполагает ATL, но есть общая информация о com collection) свойства вариантов. Сделайте вызов Item () коллекции, принимающей строки. Доступ к нему будет выглядеть так (коллекция называется «Свойства»):
myValue = myControl.Properties("Name")
Я не уверен, как вы могли бы установить такие значения?
myControl.Properties("Name") = newValue
Для этого может потребоваться, чтобы коллекция возвращала не варианты, а COM-объекты со свойством «default». Я даже не помню многих деталей свойств по умолчанию - но я думаю, что клиенты VB6 хорошо их поддерживают, и все, что вам нужно, это установить некоторые атрибуты в вашем файле IDL / ODL.
Обе идеи требуют, чтобы вызывающие стороны имели небольшую косвенность метода (Get / SetProperty) или использование свойства коллекции (myobject.Properties.XXXX). Если вы ДОЛЖНЫ иметь следующий синтаксис:
x = myControl.MyDynamticProperty
Вам нужно написать собственную реализацию IDispatch GetIDsOfName и Invoke. Я сделал это недавно, это было ужасно. К счастью, все это было удалено, поскольку в этой части приложения мы пошли в другом направлении. Вы должны были бы заставить вызывающих абонентов использовать нежизнеспособный интерфейс IDispatch (и быть с поздним связыванием) - я полагаю, это может быть легко или сложно в зависимости от языка вызова. Мои абоненты всегда были VB script , поэтому это не было проблемой.