从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不起作用
Retrieving address/pointer (IXMLDOMNode*) from struct stored in LPARAM of CTreeCtrl - not working
在自定义CTreeCtrl
类中,我LPARAM
添加一个指向自定义结构>的指针,其中包含指向IXMLDOMNode*
的地址。
稍后,我想从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
?
- 如果您有指针,请始终使用 DWORD_PTR。只是为了64位兼容性。
- COM 指针使用引用计数。CComPtr 关心这个参考计数。将 CComPtr 传递给结构。您可以在不增加引用计数的情况下从 CComPtr 中获取对象指针。因此,当您尝试使用它时,您的对象可能已经被销毁,因为 CComPtr 已经被销毁了。
还要在 TreeItemData 结构中使用智能指针。这还可以确保在释放树项结构时释放对象。
警告:您知道,当您从 CTreeCtrl 中删除树项时,您必须释放所有这些结构。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不起作用
- 返回指向 IXMLDOMNode 的指针作为参数.多么痛苦