在制作 OPC Client 的时候通常需要浏览OPC Serve的所有已经定义的item名称(当然OPC Server必须支持这个选项)如果用VC的话就要使用到IOPCBrowseServerAddressSpace接口那么下面是提取item目录结构的一个自制的递归函数 void TryBrowseBranch(IOPCBrowseServerAddressSpace *pBSAS LPCWSTR lpprestrLPCWSTR lpcw) { HRESULT r; OPCNAMESPACETYPE onst; LPWSTR pItemID; WCHAR s*lp; IEnumString *pEnum = ; char szBuf[]; long nPos = ; HRESULT r = S_OK; LPOLESTR pStr; ULONG actual; lp = WSTRFromSBCS(%ls%lspIMalloc); // 向lpcw节点的枝叶改变位置 pBSAS>ChangeBrowsePosition(OPC_BROWSE_DOWNlpcw); r = pBSAS>BrowseOPCItemIDs(OPC_FLAT&sVT_EMPTY&pEnum); pBSAS>QueryOrganization(&onst); // 提取该节点下的所有枝叶 while((r = pEnum>Next( &pStr &actual)) == S_OK) { printf(%ls%ls%ls\nlpprestrlpcw pStr); wprintf(lpprestrlplpcwpStr); if(onst == OPC_BRANCH) TryBrowseBranch(pBSASlpprestrpStr); } // 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_UPlpcw); } |