gpt4 book ai didi

c++ - "Access violation"与 COleVariant

转载 作者:行者123 更新时间:2023-11-28 00:59:45 25 4
gpt4 key购买 nike

我有一个函数

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;”后返回“Access violation”但我不知道为什么。有什么建议吗?

最佳答案

好吧,寻求建议并不真正符合 Stack Overflow 的问答格式,因此投票结束问题并不是不对的。另一方面,许多其他人可能也在做同样的 Bad Things™,并且可以从被告知这件事中受益。所以:

  1. 不要使用像 (AXAPILib::ICollection*) m_Collection.p 这样的 C 风格转换。如果没有转换就无法编译,那么它就是错误的。添加类型转换会隐藏一个错误。

    在这种情况下,移除强制转换的特殊情况应该不会有任何影响。但是在代码中有这样的转换是完全不好的。它们不仅会隐藏错误(通过抑制警告和错误),还会主动引入错误。

  2. 不要使用像 (IDispatch*) indices 这样的 C 风格转换。如果代码在没有转换的情况下无法编译,那么它就是错误的。添加类型转换会隐藏一个错误。

    对于第二次施法,移除施法可能会产生剧烈的效果,也可能不会。潜在的剧烈影响是代码不再编译。在那种情况下,您知道出了什么问题(尽管很可能这里除了类型转换本身没有任何问题)。

  3. 不要混合使用智能指针和“原始”指针,除非您真的非常知道自己在做什么。

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

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

一个解决这个问题的方法是要求智能指针放弃它对包含的原始指针的所有权。

对于您正在使用的特定 Microsoft 智能指针,它的 MSDN 库文档说您可以通过调用 Detach() 成员函数来实现。令人困惑的是,wrt。命名,对于 C++ 标准库的智能指针,作为一般约定,它是通过调用 release() 成员来完成的。值得注意的是,微软 Release() 和标准库 release() 是两个截然不同的操作,分别是 ref count decrement 和,呃,detach...

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

关于c++ - "Access violation"与 COleVariant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9386700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com