如何使用ATL创建VB6集合对象

Bin*_*ier 1 c++ vb6 compatibility atl

或VB6兼容 - 集合对象.

我们通过一组API为我们的.net产品提供钩子.

我们需要继续支持从VB6调用API的客户,因此我们需要继续支持VB6集合对象(在.net中使用VBA.Collection很简单).

问题是支持一些使用VBScript来调用我们API的网站.VBScript没有集合对象的概念,因此要创建一个集合对象以传递给我们的API,我们构建了一个VB6 ActiveX DLL,它提供了一个"CreateCollection"方法.此方法只是创建并传回一个新的集合对象.问题解决了.

经过多年的修剪,移植和重建,这个DLL是我们唯一的VB6代码.因此,我们仍然需要在Dev&build Machines上安装Visual Studio 6.

我不满意我们依赖这个DLL有几个原因(我个人不喜欢VB6不是其中之一).最重要的是微软不再支持Visual Studio 6.

我的问题是,如何让ATL创建一个实现与VB6集合对象相同的接口的集合对象.

我对C++有一个很好的处理,但只是对ATL的松散掌握 - 我可以创建简单的对象并实现简单的方法,但这超出了我的范围.

Geo*_*che 8

集合或多或少基于约定.他们实现IDispatch并公开了一些标准方法和属性:

  • Add()- 可选
  • Remove()- 可选
  • Item()
  • Count- 只读
  • _NewEnum- 隐藏,只读,返回指向实现的枚举器对象的指针IEnumVariant

_NewEnum属性是允许Visual Basic的For Each.

在IDL中,您使用dual接口并:

  • DISPID_VALUE 对于 Item()
  • [propget, id(DISPID_NEWENUM), restricted] HRESULT _NewEnum([out, retval] IUnknown** pVal)

以下是一些MSDN条目:ActiveX对象的设计注意事项以下
是一些ATL特定的便利:ATL集合和枚举器