上一篇讲到了OPC客户端已经成功连接了OPC服务器,下面就开始整理OPC开发的核心部分——组和项的管理。
不多说了,直接上代码,首先是IUnkown接口获取:
/*获取OPC服务器IUnknow接口指针*/
pIUnknown = (IUnknown*)mqi[0].pItf; //得到第三个指针
ASSERT(pIUnknown);
然后获取IOPCServer接口:
LONG lTimeBias = 0;
FLOAT fTemp = 0.00;
OPCHANDLE hOPCServer1; //第一个OPC SERVER句柄
DWORD dwActualRate = 0;
hr = pIUnknown->QueryInterface(IID_IOPCServer,/*OUT*/(void**)&pIServer); //得到第四个指针
ASSERT(pIServer);
if (FAILED(hr)){
cout << "未能获取IOPCServer接口..." << endl;
CoTaskMemFree(&hOPCServer1);
CoTaskMemFree(&clsid); //第四个内存释放
CoTaskMemFree(&catID); //第三个内存释放
CoTaskMemFree(&mqi); //第二个内存释放
CoTaskMemFree(&si); //第一个内存释放
if (pIServer) pIServer->Release(); //第四个内存释放
pIServer = NULL;
if (pIUnknown) pIUnknown->Release(); //第三个内存释放
pIUnknown = NULL;
if (pIEnumGUID) pIEnumGUID->Release(); //第二个指针释放
pIEnumGUID = NULL;
if (pIServerList) pIServerList->Release(); //第一个指针释放
pIServerList = NULL;
return 1;
}
else if (SUCCEEDED(hr))
{
cout << "已获取IOPCServer接口" << endl;
}
添加组:
hr = pIServer->AddGroup(L"Group", TRUE, 10, 1235, &lTimeBias, &fTemp, 0, /*OUT*/ &hOPCServer1,
&dwActualRate, IID_IOPCItemMgt, /*OUT*/ (LPUNKNOWN*)&pIOPCItemMgt); //得到第五个指针
ASSERT(pIOPCItemMgt);
ASSERT(hOPCServer1);
if (FAILED(hr)) {
cout << "未能添加组..." << endl;
CoTaskMemFree(&clsid); //第四个内存释放
CoTaskMemFree(&catID); //第三个内存释放
CoTaskMemFree(&mqi); //第二个内存释放
CoTaskMemFree(&si); //第一个内存释放
if (pIOPCItemMgt) pIOPCItemMgt->Release(); //第五个指针释放
pIOPCItemMgt = NULL;
if (pIServer) pIServer->Release(); //第四个指针释放
pIServer = NULL;
if (pIUnknown) pIUnknown->Release(); //第三个指针释放
pIUnknown = NULL;
if (pIEnumGUID) pIEnumGUID->Release(); //第二个指针释放
pIEnumGUID = NULL;
if (pIServerList) pIServerList->Release(); //第一个指针释放
pIServerList = NULL;
return 1;
}
else if (SUCCEEDED(hr)) {
cout << "已添加组..." << endl;
}
为存放Item的数组分配内存:
itemArray = (OPCITEMDEF*)CoTaskMemAlloc(sizeof(OPCITEMDEF)); //第五个内存 指向存放数据项
为组添加项:
"code"class="cpp">hOPCServer2 = (OPCHANDLE*)CoTaskMemAlloc(119 * sizeof(OPCHANDLE));
CString str = "xxxxxx";
BSTR bstr = str.AllocSysString();
itemArray[0].szAccessPath = L"";
itemArray[0].szItemID = bstr;
itemArray[0].bActive = true; // active state
itemArray[0].hClient = (OPCHANDLE)0; // our handle to item
itemArray[0].dwBlobSize = 0; // no blob support
itemArray[0].pBlob = NULL;
itemArray[0].vtRequestedDataType = VT_R4;
itemArray[0].wReserved = 0;
hOPCServer2 = (OPCHANDLE*)CoTaskMemAlloc(119 * sizeof(OPCHANDLE));
hr = pIOPCItemMgt->AddItems(1, itemArray, (OPCITEMRESULT**)&pItemResult, (HRESULT**)&pErrors);ASSERT(pItemResult);ASSERT(pErrors);if (FAILED(hr)){cout << "未能为组添加数据项..." << endl;if (pItemResult) CoTaskMemFree(pItemResult);if (pErrors) CoTaskMemFree(pErrors);CoTaskMemFree(&hOPCServer1);CoTaskMemFree(&hOPCServer2); //第六个内存释放CoTaskMemFree(&itemArray); //第五个内存释放CoTaskMemFree(&clsid); //第四个内存释放CoTaskMemFree(&catID); //第三个内存释放CoTaskMemFree(&mqi); //第二个内存释放CoTaskMemFree(&si); //第一个内存释放if (pIOPCItemMgt) pIOPCItemMgt->Release(); //第五个指针释放pIOPCItemMgt = NULL;if (pIServer) pIServer->Release(); //第四个指针释放pIServer = NULL;if (pIUnknown) pIUnknown->Release(); //第三个指针释放pIUnknown = NULL;if (pIEnumGUID) pIEnumGUID->Release(); //第二个指针释放pIEnumGUID = NULL;if (pIServerList) pIServerList->Release(); //第一个指针释放pIServerList = NULL;return 1;}else if (SUCCEEDED(hr)) {cout << "已经为组添加数据项..." << endl;} 至此,OPC组和项已经添加完毕。