Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在ICollectionOnSTImpl实现中,可以';t访问m#t或项目对象';s成员_C++_Com_Vb6_Atl - Fatal编程技术网

C++ 在ICollectionOnSTImpl实现中,可以';t访问m#t或项目对象';s成员

C++ 在ICollectionOnSTImpl实现中,可以';t访问m#t或项目对象';s成员,c++,com,vb6,atl,C++,Com,Vb6,Atl,我试图通过VC6实现一个对象集合,它可以被VB6程序访问。我一直没能把它结合起来 我已经定义了_copyVariantFromadaptf和_copyITFFRomadaptf(来自“ATL内部”)。 以下是要在我的集合定义中使用的我的定义: #define CComEnumVariantOnListOfItemInterface(ItemInterface) \ CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT,

我试图通过VC6实现一个对象集合,它可以被VB6程序访问。我一直没能把它结合起来

我已经定义了_copyVariantFromadaptf和_copyITFFRomadaptf(来自“ATL内部”)。 以下是要在我的集合定义中使用的我的定义:

#define CComEnumVariantOnListOfItemInterface(ItemInterface) \
    CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT,_CopyVariantFromAdaptItf<ItemInterface>,vector< CAdapt< CComPtr<ItemInterface> > > >

#define ClassInterfaceCollImpl(ContainerInterface,ItemInterface) \
    ICollectionOnSTLImpl< IDispatchImpl< ContainerInterface, &__uuidof(ContainerInterface) >,\
    vector< CAdapt< CComPtr<ItemInterface> > >,ItemInterface*,_CopyItfFromAdaptItf<ItemInterface>,\
    CComEnumVariantOnListOfItemInterface(ItemInterface) >

#define ContainerInterface      IFields
#define ContainerClass          CFields
#define ContainerClsid          CLSID_Fields
#define ItemInterface           IField
#define DllRegID                IDR_FIELDS

typedef std::vector< CAdapt< CComPtr<ItemInterface> > > ContainerType;
#定义CComEnumVariantOnListOfItemInterface(ItemInterface)\
CComEnumOnSTL>>
#定义ClassInterfaceClimpl(ContainerInterface,ItemInterface)\
ICollectionsTLimpl\
向量>,项接口*,\u copyitfromadaptf\
CComEnumVariantOnListOfItemInterface(ItemInterface)>
#定义容器接口IField
#定义ContainerClass CFields
#定义ContainerClsid_字段
#定义ItemInterface IField
#定义DllRegID IDR_字段
typedef std::vector>容器类型;
这是容器类的序言:

class ATL_NO_VTABLE ContainerClass : 
    public ClassInterfaceCollImpl(ContainerInterface,ItemInterface),
    public ISupportErrorInfo,
    public CComObjectRoot,
    public CComCoClass<ContainerClass,&ContainerClsid>
{
public:
    ContainerClass();
BEGIN_COM_MAP(ContainerClass)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(ContainerInterface)
    COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
//DECLARE_NOT_AGGREGATABLE(CFields) 
// Remove the comment from the line above if you don't want your object to 
// support aggregation. 

DECLARE_REGISTRY_RESOURCEID(DllRegID)
// ISupportsErrorInfo
    STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);

// IFields
private:
    int GetIndex( BSTR name );
class ATL\u NO\u VTABLE集装箱类别:
公共ClassInterfaceClimpl(容器接口、项接口),
公共ISupportErrorInfo,
公共ccombjectroot,
公共类
{
公众:
容器类();
开始COM地图(集装箱类)
COM_接口_条目(IDispatch)
COM_接口_条目(ContainerInterface)
COM_接口_条目(ISupportErrorInfo)
END_COM_MAP()
//声明不可聚合(CFields)
//如果不希望对象被删除,请删除上面一行中的注释
//支持聚合。
声明\u注册表\u资源ID(DllRegID)
//ISupportsErrorInfo
标准方法(接口支持信息)(REFIID riid);
//伊菲尔德
私人:
int GetIndex(BSTR名称);
等等

在我尝试的实现中,我尝试扫描包含的对象,查找在对象的函数pName()中访问的匹配名称。请注意,我展示了我尝试过的两种不同方法:

int CFields::GetIndex( BSTR name )
{

    long count = 0;
#if (1)
    Count(&count);
    for (unsigned int i=0; i<count; i++)
        if (wcscmp( name, m_coll.m_T->pName())
            return (i);
#else
    std::vector<CAdapt<CComPtr<IField> > >::iterator itr;
        for (itr = m_coll.begin(); itr != m_coll.end(); itr++)
            if (wcscmp( name, itr->m_T->pName()))
                count++;
            else
                return (count);

#endif
    throw E_INVALIDARG_13;
}
int CFields::GetIndex(BSTR名称)
{
长计数=0;
#如果(1)
计数(&Count);
for(unsigned int i=0;ipName())
回报(i);
#否则
std::vector::迭代器itr;
对于(itr=m_coll.begin();itr!=m_coll.end();itr++)
如果(wcscmp(名称,itr->m\u T->pName())
计数++;
其他的
返回(计数);
#恩迪夫
投掷E_INVALIDARG_13;
}

如果我尝试#If(1),我会得到一个错误,即m#T不是“vector”的成员我知道我在自言自语,但我希望在遇到正确答案时能帮助其他人

好的,我有一个工作系统,根据对另一个问题的回答,这就是我的结论。我添加了一行:

COM_INTERFACE_ENTRY_IID(CLSID_Fields, CFields)
在 开始地图(CFields) 和 END_COM_MAP() 这样getItemObjectPtr就可以工作了

我将ItemInterface更改回IField,并将GetIndex方法更改为:

    long count = 0;
    ContainerType::iterator itr;
for (itr = m_coll.begin(); itr != m_coll.end(); itr++)
    if (wcscmp( name, getItemObjectPtr( itr->m_T )->pName()) == 0)
        count++;
    else
        return (count);
    throw (HRESULT)E_INVALIDARG_13;
方法getItemObjectPtr定义为:

CFields * CrecordSet::getItemObjectPtr( IFields *ppFields )
{
    CComQIPtr<CFields, &CLSID_Fields> pFields = ppFields;
    return (pFields);
}
CFields*CrecordSet::getItemObjectPtr(IFields*ppFields)
{
CComQIPtr pFields=ppFields;
返回(pFields);
}

你知道VC6是死的和不支持的吗?它甚至早于1998 C++标准,它的标准库的实现也不符合(不奇怪)。升级,否则你是自己的。,对使用此运算符的标准库模板造成破坏,该模板需要指针。当然,VC6不受支持。但由于VB6仍然很流行,并且有很多遗留代码可供使用,VC6似乎工作起来更轻松。无论如何,它必须支持我尝试做的事情,即提供对象集合(每个都可能有自己的集合…)到现有的VB6程序。事实上,下一步是去VC 2010。