首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从存储在CTreeCtrl内存中的结构中检索地址/指针(IXMLDOMNode*) -不工作

从存储在CTreeCtrl内存中的结构中检索地址/指针(IXMLDOMNode*) -不工作
EN

Stack Overflow用户
提问于 2015-01-12 09:59:20
回答 1查看 216关注 0票数 0

在自定义CTreeCtrl类中,我将指向自定义结构->包含到IXMLDOMNode*的地址的指针添加为LPARAM

稍后,我希望从LPARAM中获取指针,并将其中的地址转换回IXMLDOMNode*

只要我在相同的作用域/函数中使用它(仅在函数中测试),它就能正常工作。当我在其他函数/类中使用它检索指针并将包含的地址转换为IXMLDOMNode*时,它是正确的给定地址。问题是,当我尝试使用它的一个函数(例如get_nodeName(BSTR *name))时,它会抛出一个未处理的异常。

Unhandled exception at 0x6522b1b8 in Program.exe: 0xC0000005: Access violation reading location 0x00000000.

插入:

代码语言:javascript
复制
HTREEITEM InsertIntoTree(CustomTreeCtrl &xCtrl, const HTREEITEM hCurrent, CComPtr<IXMLDOMNode> &cpCurrent)
{
    TVINSERTSTRUCT tvItem = {0};
    //[...]
    //tvItem.item.mask has TVIF_PARAM && other flags set...

    tvItem.item.lParam = TreeItemData(cpCurrent, 0).Alloc()->Address();
    //[...]
}

Get (CustomTreeCtrl中的测试位置):

代码语言:javascript
复制
else
{
    TreeItemData *tiData = TreeItemData::GetPointer(GetItemData(m_hActiveItem)); //Fine
    CComPtr<IXMLDOMNode> F = tiData->GetCComPtr(); //Fine
    BSTR Name = nullptr;
    F->get_nodeName(&Name); //Unhandled Exception
}

结构:

代码语言:javascript
复制
struct TreeItemData
{
    //[...]
    TreeItemData(CComPtr<IXMLDOMNode> &pNode, DWORD dwFlags)
    {
        m_dwCComPtrAddress  =   reinterpret_cast<DWORD>(&*pNode);
        m_dwFlags           =   dwFlags;
    }

    CComPtr<IXMLDOMNode> GetCComPtr(void)
    {
        return CComPtr<IXMLDOMNode>(reinterpret_cast<IXMLDOMNode*>(m_dwCComPtrAddress));
    }

    TreeItemData *Alloc(void)
    {
        return new TreeItemData(*this);
    }

    LPARAM Address(void)
    {
        return reinterpret_cast<LPARAM>(&*this);
    }

    static TreeItemData *GetPointer(DWORD Address)
    {
        return reinterpret_cast<TreeItemData*>(Address);
    }

    //[...]

    DWORD m_dwCComPtrAddress;
    DWORD m_dwFlags;
};

问:什么可能是错的?我怎样才能拿回指向IXMLDOMNode 的工作指针?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-12 11:57:23

  1. 如果有指针,请始终使用DWORD_PTR。只是为了64位的兼容性。
  2. COM指针使用引用计数。CComPtr关心这个裁判计数。将一个CComPtr传递给您的结构。在不增加ref计数的情况下,将对象指针从CComPtr中取出。因此,当您尝试使用对象时,您的对象可能已经被销毁,因为CComPtr已经被销毁。

还可以在TreeItemData结构中使用智能指针。这还可以确保在树项结构被释放时释放对象。

警告:当您从CTreeCtrl中删除树项时,您知道必须释放所有这些结构。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27899331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档