在自定义CTreeCtrl类中,我将指向自定义结构->包含到IXMLDOMNode*的地址的指针添加为LPARAM。
稍后,我希望从LPARAM中获取指针,并将其中的地址转换回IXMLDOMNode*。
只要我在相同的作用域/函数中使用它(仅在函数中测试),它就能正常工作。当我在其他函数/类中使用它检索指针并将包含的地址转换为IXMLDOMNode*时,它是正确的给定地址。问题是,当我尝试使用它的一个函数(例如get_nodeName(BSTR *name))时,它会抛出一个未处理的异常。
Unhandled exception at 0x6522b1b8 in Program.exe: 0xC0000005: Access violation reading location 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();
//[...]
}Get (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 的工作指针?
发布于 2015-01-12 11:57:23
还可以在TreeItemData结构中使用智能指针。这还可以确保在树项结构被释放时释放对象。
警告:当您从CTreeCtrl中删除树项时,您知道必须释放所有这些结构。
https://stackoverflow.com/questions/27899331
复制相似问题