从PROP_ENTRY转换为PROP_ENTRY_TYPE

时间:2012-01-06 19:27:01

标签: c++ activex atl

我继承了一个使用Ole和ActiveX工具的旧项目。编译在PROP_ENTRY宏上给出了一个弃用警告,它们替换为PROP_ENTRY_TYPE,但它接受第四个参数。我找到了一个类型列表,如VT_BSTR,VT_UNIT,VT_UNKNOWN等,但我不清楚如何弄清楚应该是什么类型。既然旧的宏不需要类型,那么我可以使用旧的做事方式的默认类型吗?如果不这样做,任何人都有关于这些项目应该是什么类型的建议?我尝试将VT_BSTR用于所有内容,因为大多数值可能是(?)字符串,但在某些ActiveX内容中会失败;还试过VT_UNKNOWN。建议表示赞赏。事情确实与旧代码一起运行(有一些问题),但能够向前移动我们的代码库会很好。 谢谢, 肯

BEGIN_PROPERTY_MAP(CCiButton)
#if 1
        // old style
    PROP_ENTRY("Caption", DISPID_CAPTION, CLSID_NULL)
    PROP_ENTRY("Back Color", DISPID_BACKCOLOR, CLSID_StockColorPage)
    PROP_ENTRY("Fill Color", DISPID_FILLCOLOR, CLSID_StockColorPage)
    PROP_ENTRY("Font", DISPID_FONT, CLSID_StockFontPage)
    PROP_ENTRY("Picture", DISPID_PICTURE, CLSID_StockPicturePage)
    PROP_ENTRY("Button Style", 1, CLSID_CiButtonProp)
    PROP_ENTRY("Text Color", 2, CLSID_StockColorPage)
    PROP_ENTRY("Text Shadow Color", 3, CLSID_StockColorPage)
    PROP_ENTRY("Tool Tip Text", 4, CLSID_CiButtonProp)
    PROP_ENTRY("Disabled Picture", 5, CLSID_StockPicturePage)
    PROP_ENTRY("Enabled", DISPID_ENABLED, CLSID_NULL)
#else
        // new style, fails.
    PROP_ENTRY_TYPE("Caption", DISPID_CAPTION, CLSID_NULL, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Back Color", DISPID_BACKCOLOR, CLSID_StockColorPage, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Fill Color", DISPID_FILLCOLOR, CLSID_StockColorPage, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Font", DISPID_FONT, CLSID_StockFontPage, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Picture", DISPID_PICTURE, CLSID_StockPicturePage, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Button Style", 1, CLSID_CiButtonProp, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Text Color", 2, CLSID_StockColorPage, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Text Shadow Color", 3, CLSID_StockColorPage, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Tool Tip Text", 4, CLSID_CiButtonProp, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Disabled Picture", 5, CLSID_StockPicturePage, VT_UNKNOWN)
    PROP_ENTRY_TYPE("Enabled", DISPID_ENABLED, CLSID_NULL, VT_UNKNOWN)
#endif
END_PROPERTY_MAP()

2 个答案:

答案 0 :(得分:1)

需要作为第三个参数放置的varient类型是您正在使用的属性返回的值的类型

例如PROP_ENTRY_TYPE(“已启用”,DISPID_ENABLED,CLSID_NULL,VT_BOOL)

现在,如果您不确定应该发送的数据类型是什么,那么您可以传递VT_EMPTY。原因是宏PROP_ENTRY和PROP_ENTRY_TYPE在内部调用相同的API,它将varient类型作为参数之一。

在PROP_ENTRY_TYPE的情况下,传递的varient类型是宏中传递的类型。

在PROP_ENTRY的情况下,传递的varient类型是VT_EMPTY。 因此,您可以直接在PROP_ENTRY_TYPE中传递VT_EMPTY以避免此问题。

例如PROP_ENTRY_TYPE(“已启用”,DISPID_ENABLED,CLSID_NULL,VT_EMPTY)

此致 RISHABH

答案 1 :(得分:0)

VT_UNKNOWN表示保存IUnknown*接口指针的变体类型,这不是您的场景(字体和图片属性可能有接口指针而不是另一个)。

您会在Windows SDK文件中找到VT_常量映射的类型,例如: OAIDL.H:

/* VARIANT STRUCTURE
 *
 *  VARTYPE vt;
 *  WORD wReserved1;
 *  WORD wReserved2;
 *  WORD wReserved3;
 *  union {
 *    LONGLONG       VT_I8
 *    LONG           VT_I4
 *    BYTE           VT_UI1
 *    SHORT          VT_I2
 *    FLOAT          VT_R4
 *    DOUBLE         VT_R8
 *    VARIANT_BOOL   VT_BOOL
 *    SCODE          VT_ERROR
 *    CY             VT_CY
 *    DATE           VT_DATE
 *    BSTR           VT_BSTR
 *    IUnknown *     VT_UNKNOWN
 *    IDispatch *    VT_DISPATCH
 *    SAFEARRAY *    VT_ARRAY

这是您可以从中选择所需的地方。