发表于:2004-05-11 00:07:00
                
                9楼
             
            
                重贴一下上次回复刘清的帖子:
以下仅供参考:
一、为了支持回调,OPC服务器和客户端必须具备的条件
    OPC服务器:实现IConnectionPointContainer接口,并且拥有一个连接点(IConnectionPoint),支持IOPCDataCallback回调接口。
    OPC客户端:为了能够使用连接点,通常需要创建一个对象(AAA),该对象支持IUnknown和IOPCDataCallback接口。
二、OPC服务器和客户端的协作过程
    1.客户程序首先获得服务器的IConnectionPoint接口指针,然后通过IConnectionPoint::Advise()将对象AAA的IUnknown接口指针传给服务器。
    2.服务器在接收到该指针后,将通过AAA的QueryInterface()获得IOPCDataCallback接口,并保存IOPCDataCallback接口指针。
    3.服务器在适当的时候(如果是自己开发服务器,想什么时候就什么时候了)会调用AAA所实现的IOPCDataCallback::OnDataChange(),IOPCDataCallback::OnReadComplete,IOPCDataCallback::OnWriteComplete,IOPCDataCallback::OnCancelComplete四个函数。
三、关于数据类型
   请看OPC 规范中IOPCDataCallback::OnDataChange的定义:
	HRESULT OnDataChange(
        [in]                   DWORD      dwTransid, 
        [in]                   OPCHANDLE  hGroup, 
        [in]                   HRESULT    hrMasterquality,
        [in]                   HRESULT    hrMastererror,
        [in]                   DWORD      dwCount, 
        [in, size_is(dwCount)] OPCHANDLE* phClientItems, 
        [in, size_is(dwCount)] VARIANT*   pvValues, //注意此处的数据类型
        [in, size_is(dwCount)] WORD*      pwQualities,
        [in, size_is(dwCount)] FILETIME*  pftTimeStamps,
        [in, size_is(dwCount)] HRESULT*   pErrors
    );
  显然,服务器发送给客户程序的数据类型是VARIANT类型的数组,也就是说基本上是任意的数据类型了,包括BOOL类型!
注:以上内容我参考的是 OPC DA Specification 3.0,该规范在www.OPCFoundation.org上可以免费下载。