在制作 opc client 的时候通常需要浏览opc serve的所有已经定义的item名称(当然opc server必须支持这个选项),如果用vc的话就要使用到iopcbrowseserveraddressspace接口,那么,下面是提取item目录结构的一个自制的递归函数。
void trybrowsebranch(iopcbrowseserveraddressspace *pbsas, lpcwstr lpprestr,lpcwstr lpcw)
{
hresult r1;
opcnamespacetype onst;
lpwstr pitemid;
wchar s,*lp;
ienumstring *penum = 0;
char szbuf[40];
long npos = 1;
hresult r2 = s_ok;
lpolestr pstr;
ulong actual;
lp = wstrfromsbcs("%ls,%ls",pimalloc);
// 向lpcw节点的枝叶改变位置
pbsas->changebrowseposition(opc_browse_down,lpcw);
r1 = pbsas->browseopcitemids(opc_flat,&s,vt_empty,0,&penum);
pbsas->queryorganization(&onst);
// 提取该节点下的所有枝叶
while((r2 = penum->next(1, &pstr, &actual)) == s_ok)
{
printf("%ls%ls--%ls/n",lpprestr,lpcw, pstr);
wprintf(lpprestr,lp,lpcw,pstr);
if(onst == opc_branch)
trybrowsebranch(pbsas,lpprestr,pstr);
}
// pbsas->changebrowseposition(opc_browse_down,
// printf("opc_ns_hierarchial 含有枝干");
// get firset item
pimalloc->free(lp);
pimalloc->free(pstr);
penum->release();
// 回到名叫lpcw的主干位置
pbsas->changebrowseposition(opc_browse_up,lpcw);
}
闽公网安备 35060202000074号