有谁知道是否可以在运行时生成 ActiveX 属性?
我只需要能够从 Visual Basic 中获取和设置这些属性。
我的 ActiveX 控件是用 C++ 编码的,我已经知道如何通过实现硬编码的 C++ get 和 put 函数来创建属性。但是,我可能拥有此 ActiveX 控件的大量属性集,理想情况下,公开的属性集将根据 ActiveX 控件的内部状态而改变。
我希望有一种方法可以从数据中生成属性,例如下面的 XML:
<Properties>
<Property>
<Name>SomeProperty</Name>
<Type>Int</Type>
<DefaultValue>10</DefaultValue>
</Property>
...
<Properties>
谢谢
最佳答案
这可能非常简单,也可能有些困难,具体取决于您需要的语法。
一种方法是在 ActiveX 控件中创建您自己的名称/值集合。 您可以只添加两种方法:
HRESULT GetPropery([in] BSTR name, [out,retval] VARIANT value);
HRESULT SetPropery([in] BSTR name, [in] VARIANT value);
基本上,您将在控件上拥有一个属性,该属性将包含所有其他属性的集合。这是最直接的方法。
您可以创建一个 com collection (链接采用 ATL,但有关于 com 集合的一般信息)变体属性。使集合的 Item() 调用接受字符串。访问它就像(集合被命名为“Properties”):
myValue = myControl.Properties("Name")
我不确定您如何设置这样的值?
myControl.Properties("Name") = newValue
这可能要求集合返回的不是变体,而是具有“默认”属性的 COM 对象。我什至不记得默认属性的很多细节 - 但我认为 VB6 客户端很好地支持它们,你所要做的就是在你的 IDL/ODL 文件中设置一些属性。
这两种想法都要求调用者有一点间接的方法 (Get/SetProperty) 或使用集合属性 (myobject.Properties.XXXX)。如果你必须有这样的语法:
x = myControl.MyDynamticProperty
您需要编写自己的实现IDispatch 的 GetIDsOfName 和调用。我以前做过这个,它很难看。值得庆幸的是,这一切都被删除了,因为我们对应用程序的那部分采取了不同的方向。您必须强制调用者使用非 vtable IDispatch 接口(interface)(并进行后期绑定(bind))——我想这可能很容易也可能很难,具体取决于调用语言。我的调用者始终是 VB 脚本,所以这不是问题。
关于c++ - ActiveX 属性(从 Visual Basic 访问)是否可以在运行时按程序生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/594391/