gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:34:40 25 4
gpt4 key购买 nike

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

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

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

Program.exe 中 0x6522b1b8 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。

插入:

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();
//[...]
}

获取(CustomTreeCtrl中的测试位置):

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

结构:

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 的工作指针?

最佳答案

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

在您的 TreeItemData 结构中也使用一个智能指针。这也确保在释放树项结构时释放对象。

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

关于c++ - 从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27899331/

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