使用COleVariant进行“访问冲突”

时间:2012-02-21 23:01:19

标签: c++ mfc

我有一个功能

BOOL AltairListDialog::GetDocuments()
{
    CComQIPtr<AXAPILib::ICollection> m_Collection;
    HRESULT hr = m_Collection.CoCreateInstance(L"Axapi.Collection");
    AXAPILib::ICollection *indices = (AXAPILib::ICollection*) m_Collection.p;

    int status;
    COleVariant ind;
    ind.vt = VT_DISPATCH;
    ind.pdispVal = (IDispatch*) indices;

    return TRUE;
}

我使用了一个实现AXAPILib :: ICollection的DLL。该函数在“return TRUE”之后返回“访问冲突”;但我不知道为什么。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

好吧,钓鱼获取建议并不符合Stack Overflow的问答格式,所以投票结束这个问题并不合适。另一方面,许多其他人可能正在做同样的Bad Things™,并且可以从被告知中获益。所以:

  1. 请勿使用(AXAPILib::ICollection*) m_Collection.p之类的C样式转换。如果在没有强制转换的情况下它没有编译,那么它只是错误。添加强制转换然后隐藏了一个错误。

    在这种情况下,移除演员表的特殊情况不应有任何影响。但是在代码中有这样的演员阵容是完全没有意义的。他们不仅隐藏了错误(通过抑制警告和错误),还积极引入错误。

  2. 请勿使用(IDispatch*) indices之类的C样式转换。如果代码没有编译而没有编译,那么它只是错误。添加强制转换然后隐藏了一个错误。

    对于第二次演员表演,取下演员表可能会产生极大的影响。潜在的巨大影响是代码不再编译。在这种情况下,你知道什么是错的(尽管除了演员本身之外,这里最有可能没有错。)

  3. 不要混用智能指针和“原始”指针,除非你真的,真的真的知道你在做什么。

    这里智能指针的析构函数自动Release()从函数返回的对象。该对象是新创建的,没有其他引用。因此它的引用计数现在变为零,并且它被销毁。

  4. 在函数返回后,引用被破坏的对象是未定义的行为,很可能会产生您观察到的不良行为。

    一个 CURE FOR THAT 是要求智能指针放弃对所包含的原始指针的所有权。

    对于您正在使用其MSDN Library文档的特定Microsoft智能指针,您可以通过调用Detach()成员函数来执行此操作。令人困惑的是,wrt。命名,用于C ++标准库的智能指针,作为一般约定,它通过调用release()成员来完成。值得注意的是,Microsoft Release()和标准库release()是两个非常不同的操作,分别是ref count减少,呃,分离......

    最后,最好不要使用Windows API的BOOL,而是使用C ++ bool。一个原因是为了避免代码中全部大写的灼热。更技术性的原因是bool只有两个有效值,即falsetrue,而BOOL有许多不同的有效值,当一个新手程序员写expression() == TRUE之类的东西,可能会导致错误。