SOPCClient.dll 开发连接1.0服务器
数据回调模块要点
第一步:得到指向 IDataObject 接口的指针
可以用这个接口在客户端和服务器之间建立一个连接。我们可以在程序中创建一个由 IAdviseSink 接口派生的类CAdviseSink ,并创建一个实例;指向 IDataObject 接口的指针临时保存在CAdviseSink 类的 m_pDataObject 成员中。
CAdviseSink * m_CAdviseSink = new CAdviseSink;
hr = pOPCGroup->m_pIItemMgt->QueryInterface(IID_IDataObject,
(LPVOID*)&m_CAdviseSink->m_pDataObject);
第二步:取得指向IAdviseSink接口的指针
IAdviseSink 可以帮助客户端与OPC服务器建立联系,进而进行数据交互。
IAdviseSink * pAdviseSink = NULL;
hr = m_CAdviseSink->QueryInterface(IID_IAdviseSink,
(LPVOID*)&pAdviseSink);
第三步: 建立连接
需要调用IDataObject::DAdvise() 方法完成,在此方法中指向IAdviseSink 的指针将被传递给OPC服务器
FORMATETC format_etc;
format_etc.tymed = TYMED_HGLOBAL;
format_etc.ptd = NULL;
format_etc.dwAspect = DVASPECT_CONTENT;
format_etc.lindex = -1;
format_etc.cfFormat = g_nOpcFormatData;
DWORD m_dwConnection = 0;
hr = m_CAdviseSink->m_pDataObject->DAdvise(&format_etc,
ADVF_PRIMEFIRST,
pAdviseSink,
&m_dwConnection);
第四步:收到服务器的数据变化通知
如果数据发生变化,服务程序将调用IAdviseSink接口的OnDataChange()方法。这个方法是在客户应用程序中执行的。OPC项的实际数据被赋值给用户定义的成员变量m_ItemValues, 这就意味着在客户应用程序中可以获得这些想要的数据。