发表于:2009-03-30 17:31:55
楼主
为何数据回调,仅能得到一个数据的值?
第一步: 设置回调
CCallback * pCallback = new CCallback(hConnect, lpCallback);
// pCallback->AddRef();
DWORD dwCookie;
//使用Advise在连接点和调用方的接收对象之间建立一个通知连接
hr = pIConnectPoint->Advise(pCallback, &dwCookie);
第二步:添加Item
HANDLE SOPCC_AddItem(HANDLE hConnect /*OPC连接句柄*/,
HANDLE hGroup /*OPC组句柄*/,
LPCSTR ItemName /*OPC标签的名称*/)
{
//首先,得到用户指定的存放位置
COPCConn * pOPCConn = OPCCONN(hConnect);
if( NULL == pOPCConn ) return NULL;
COPCGroup * pOPCGroup = pOPCConn->OPCGROUP(hGroup);
if( NULL == pOPCGroup ) return NULL;
pOPCGroup->m_lItemMark = pOPCGroup->m_lItemMark + 1;
HRESULT hr;
OPCITEMDEF * pItemArray = NULL;
OPCITEMRESULT * pResult = NULL;
HRESULT * pError = NULL;
DWORD dwItemLength = 0;
pItemArray = (OPCITEMDEF*)CoTaskMemAlloc( sizeof(OPCITEMDEF) ); //分配内存
dwItemLength = lstrlen(ItemName);
//为Item的名称分配内存
pItemArray【0】.szItemID =
(WCHAR*)CoTaskMemAlloc( (dwItemLength + 1) * sizeof(WCHAR) );
//转换
MultiByteToWideChar(
CP_ACP,
0,
ItemName,
-1,
pItemArray【0】.szItemID,
dwItemLength + 1);
USES_CONVERSION;
pItemArray【0】.szItemID = A2W(ItemName);
//可选的通道路径,对于Simatiic Net不需要
pItemArray【0】.szAccessPath = L"";
//激活标志
pItemArray【0】.bActive = TRUE;
//Client handle 标签句柄 , 在OnDataChange中会用到
pItemArray【0】.hClient = pOPCGroup->m_lItemMark;
pItemArray【0】.dwBlobSize = 0;
pItemArray【0】.pBlob = NULL;
pItemArray【0】.vtRequestedDataType = VT_EMPTY;
pItemArray【0】.wReserved = 0;
//添加位号
hr = pOPCGroup->m_pIItemMgt->AddItems(1, //添加位号的数量
pItemArray,
(OPCITEMRESULT**)&pResult,
(HRESULT**)&pError);
if( FAILED(hr) ) //添加失败
{
//释放该位号的内存空间
if( pItemArray )
{
if( pItemArray【0】.szItemID )
{
CoTaskMemFree(pItemArray【0】.szItemID);
}
CoTaskMemFree(pItemArray);
}
if(pResult) CoTaskMemFree(pResult);
if(pError) CoTaskMemFree(pError);
return NULL;
}
else if( SUCCEEDED(hr) ) //添加成功
{
COPCItem * pOPCItem = new COPCItem;
pOPCItem->hConnect = hConnect;
pOPCItem->hGroup = hGroup;
pOPCItem->hItem = (HANDLE)pResult->hServer; //OPC位号的通信连接句柄
pOPCGroup->m_Items.push_back( pOPCItem ); //统一管理
if( pItemArray )
{
CoTaskMemFree(pResult->pBlob);
CoTaskMemFree(pResult);
pResult = NULL;
CoTaskMemFree(pError);
pError = NULL;
}
}
return (HANDLE)pOPCGroup->m_lItemMark;
}