修改 RMyProviderRowset 的继承

更新:2007 年 11 月

若要将 IRowsetLocate 接口添加到简单只读提供程序示例,请修改 RMyProviderRowset 的继承。开始时,RMyProviderRowsetCRowsetImpl 继承。需要修改它以从 CRowsetBaseImpl 继承。

若要执行此操作,请在 MyProviderRS.h 文件中创建新类 CMyRowsetImpl:

////////////////////////////////////////////////////////////////////////
// MyProviderRS.h

template <class T, class Storage, class CreatorClass, class ArrayType = CAtlArray<Storage> >
class CMyRowsetImpl:
   public CRowsetImpl<T, Storage, CreatorClass, ArrayType, CSimpleRow, IRowsetLocateImpl< T, IRowsetLocate > >
{
...
};

现在,在 MyProviderRS.h 中将 COM 接口映射编辑成下面这样:

BEGIN_COM_MAP(CMyRowsetImpl)
   COM_INTERFACE_ENTRY(IRowsetLocate)
   COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()

这将创建通知 CMyRowsetImpl 为 IRowsetIRowsetLocate 接口都调用 QueryInterface 的 COM 接口映射。为获取其他行集合类的所有实现,该映射将 CMyRowsetImpl 类链接回 OLE DB 模板定义的 CRowsetBaseImpl 类;该映射使用 COM_INTERFACE_ENTRY_CHAIN 宏,通知 OLE DB 模板扫描 CRowsetBaseImpl 中的 COM 映射以响应 QueryInterface 调用。

最后,通过修改 RAgentRowset 从 CMyRowsetImpl 继承,将 RAgentRowset 链接到 CMyRowsetBaseImpl,如下所示:

class RAgentRowset : public CMyRowsetImpl<RAgentRowset, CAgentMan, CMyProviderCommand>

RAgentRowset 现在可以使用 IRowsetLocate 接口,同时利用行集合类的其余实现。

当这些完成后,可以动态确定返回给使用者的列

请参见

参考

增强简单的只读提供程序