修改 RCustomRowset 的继承
若要将 IRowsetLocate
接口添加到简单的只读提供程序示例,请修改 CCustomRowset
的继承。 最初,CCustomRowset
继承自 CRowsetImpl
。 需要将其修改为从 CRowsetBaseImpl
继承。
为此,请在 CustomRS.h 中创建一个新类 CCustomRowsetImpl
:
////////////////////////////////////////////////////////////////////////
// CustomRS.h
template <class T, class Storage, class CreatorClass, class ArrayType = CAtlArray<Storage>>
class CMyRowsetImpl:
public CRowsetImpl<T, Storage, CreatorClass, ArrayType, CSimpleRow, IRowsetLocateImpl< T, IRowsetLocate >>
{
...
};
现在,将 CustomRS.h 中的 COM 接口映射编辑为如下:
BEGIN_COM_MAP(CMyRowsetImpl)
COM_INTERFACE_ENTRY(IRowsetLocate)
COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()
此代码创建一个 COM 接口映射,用于指示 CMyRowsetImpl
为 IRowset
和 IRowsetLocate
接口调用 QueryInterface
。 为了获得其他行集类的所有实现,映射将 CMyRowsetImpl
类链接回由 OLE DB 模板定义的 CRowsetBaseImpl
类;该映射使用 COM_INTERFACE_ENTRY_CHAIN 宏,该宏指示 OLE DB 模板扫描 CRowsetBaseImpl
中的 COM 映射以响应 QueryInterface
调用。
最后,通过将 CCustomRowset
修改为从 CMyRowsetImpl
继承,将 CCustomRowset
链接到 CMyRowsetBaseImpl
,如下所示:
class CCustomRowset : public CMyRowsetImpl<CCustomRowset, CCustomWindowsFile, CCustomCommand>
CCustomRowset
现在可以使用 IRowsetLocate
接口,同时利用行集类的其余实现。
完成此操作后,可以动态确定返回给使用者的列。