读书人

ACTIVEX属性 怎么处理能每个不同实例

发布时间: 2012-01-09 21:05:42 作者: rapoo

ACTIVEX属性 ,怎么办能每个不同实例有不同的值
下面是我的代码,我作个ACTIVEX后, 有多个ACTIVEX实例 ,
设m_NodeValue值为不同时 如 ACTIVEX实例1 m_NodeValue="1" ACTIVEX实例2 m_NodeValue="2"
下次加载这个实例后发现,所有的ACTIVEX实例的m_NodeValue值变成一样的了(ACTIVEX实例1 m_NodeValue="2" ACTIVEX实例2
m_NodeValue="2"),为什么?怎么解决?

public:
CString m_NodeValue;//结点值

BEGIN_DISPATCH_MAP(CNodeCtrl, COleControl)
DISP_PROPERTY_EX(CNodeCtrl, "NodeValue", GetNodeValue, SetNodeValue, VT_BSTR)
DISP_STOCKPROP_READYSTATE()
END_DISPATCH_MAP()


BSTR CNodeCtrl::GetNodeValue()
{
return m_NodeValue.AllocSysString(); ;
}
void CNodeCtrl::SetNodeValue(LPCTSTR lpszNewNodeValue)
{
m_NodeValue.Format(_T("%s"), lpszNewNodeValue);
SetModifiedFlag();
InvalidateControl();
}
void CNodeCtrl::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << m_NodeValue;
}
else
{
ar >> m_NodeValue;
}
}

[解决办法]
COM本身使用引用计数维护生存期的。你的需求最好使用其他维护状态的变量。

class A()
{
public:
int m_NodeValue;
}

HANDLE CNodeCtrl::CreateA()
{
A * pA = new A;
return (HANDLE)pA;
}

void CNodeCtrl::SetNodeValue(HANDLE hA, LPCTSTR lpszNewNodeValue)
{
A * pA = (A *)hA;
pA->m_NodeValue.Format(_T("%s"), lpszNewNodeValue);
SetModifiedFlag();
InvalidateControl();
}

BSTR CNodeCtrl::GetNodeValue(HANDLE hA)
{
A * pA = (A *)hA;
return pA->m_NodeValue.AllocSysString(); ;
}

读书人网 >VC/MFC

热点推荐