2012-02-21 109 views
0

我有一个函数“访问冲突” 用的COleVariant

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。该函数在“返回TRUE;”之后返回“访问冲突”但我不知道为什么。有什么建议么?

回答

3

好,钓建议并不真正适合堆栈溢出’提问和答案的格式,所以它不会是unright投票关闭的问题。在另一方面,许多人可能会做同样的坏事™,并可能被告知受益。所以:

  1. 不要用C风格的转换一样(AXAPILib::ICollection*) m_Collection.p。如果它不没有投编译,那么它仅仅是错误。添加演员然后隐藏一个错误。

    在这种情况下,特定情况下移除铸件应该不会有任何效果。但在代码中有这样的表演是完全不合时宜的。他们不仅隐藏的错误(通过抑制警告和错误),他们积极引入错误。

  2. 唐’ t使用C风格演员像(IDispatch*) indices。如果代码在编译时没有编译,那么它就是错误。添加演员然后隐藏一个错误。

    对于第二个演员阵容,删除演员阵容可能会有很大的影响。潜在的巨大影响是代码不再编译。在这种情况下,你知道什么是错的(虽然最有可能’没有错,除了演员本身)。

  3. 唐’吨混合智能指针和“原料”指针,除非你真的,真的真的知道你’重新做。

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

函数返回后,引用被销毁的对象是未定义行为,很可能会产生您观察到的不需要的行为。

一个药可医是要求智能指针放弃其所含的原始指针的所有权。

对于您使用其MSDN Library文档的特定Microsoft智能指针,您可以通过调用Detach()成员函数来做到这一点。令人困惑的是,wrt。命名为C++标准库’的智能指针,作为一般约定,它通过调用release()成员来完成。值得注意的是,微软Release()和标准库release()是两个非常不同的操作,分别是ref count递减和uh,detach&hellip;

最后,最好不要使用Windows API ’的s BOOL,而应使用C++ bool。其中一个原因就是避免在代码中全部使用大写字母。更多的技术原因是bool只有两个有效值,即falsetrue,而BOOL有几十个不同的有效值,当新手程序员编写像expression() == TRUE这样的东西时,可能导致错误。