c++ - ActiveX 属性(从 Visual Basic 访问)是否可以在运行时按程序生成?

标签 c++ vba vb6 activex

有谁知道是否可以在运行时生成 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/

相关文章:

c++ - 在模板实现文件中使用命名空间

vba - 字符串中的子字符串

arrays - 如何在Excel的vba中初始化多维数组变量

excel udf 被调用太多次

csv - 如何在 VB6 中根据匹配值合并两个 CSV 文件

c++ - 我应该使用 C(99) boolean 值吗? (还有 C++ 中的 C++ boolean 值?)

c++ - OpenCV:将矩阵作为可选参数传递

c++ - 带多个参数的显式构造函数

sql - VBA:将片段从 VBA 转换为 SQL

windows-7 - 无法在 Windows 7 中加载 VB6 OCX 错误 372