📄 opc_client.cpp
字号:
// Search the registry for installed OPC Servers:
for (DWORD dwIndex = 0;
RegEnumKey (hKey, dwIndex, szKey, dwLength) == ERROR_SUCCESS;
++dwIndex)
{
HKEY hSubKey;
// Open the registry key:
if (RegOpenKey (hKey, szKey, &hSubKey) == ERROR_SUCCESS)
{
// Search for OPC subkey:
if (RegQueryValue (hSubKey, _T("OPC"), NULL, NULL) == ERROR_SUCCESS)
{
strcpy(server[i++],szKey);
}
// Close the registry key:
RegCloseKey (hSubKey);
}
// Re-initialize length:
dwLength = 100;
}
}
extern "C" _declspec(dllexport) void opc_item_browse(char item_n[500][40])
{
HRESULT r0;
HRESULT r11;
OPCBROWSETYPE brType ;
LPCWSTR szFilt = L"*";
VARTYPE vtFilt;
DWORD arFilt;
IMalloc *pIMalloc;
IEnumString * pEnum;
int i;
pIOPCBrowse=NULL;
arFilt= OPC_ACCESS_READ;
vtFilt = VT_EMPTY;
i=0;
brType = OPC_FLAT;
// 请求获得一个IOPCServer接口
r0 = m_IOPCServer->QueryInterface(IID_IOPCServer, (void**)&m_IOPCServer);
// 请求获得一个IOPCBrowseServerAddressSpace 接口
//
r0 = m_IOPCServer->QueryInterface(IID_IOPCBrowseServerAddressSpace, (void**)&pIOPCBrowse);
if (FAILED(r0))
{
MessageBox(NULL,"Not Exist IOPCBrowseServerAddressSpace","Error",MB_OK);
}
r11 = pIOPCBrowse->BrowseOPCItemIDs(brType, szFilt, vtFilt, arFilt, &pEnum);
if (FAILED(r11))
{
MessageBox(NULL,"BrowseOPCItemIDs Error","Error",MB_OK);
}
else
{
HRESULT r2 = S_OK;
LPOLESTR pStr;
LPOLESTR pName;
ULONG actual;
if (pEnum) {
while((r2 = pEnum->Next(1, &pStr, &actual)) == S_OK) {
pIOPCBrowse->GetItemID(pStr, &pName);
//MessageBox(NULL,_com_util::ConvertBSTRToString(pName),"Name",MB_OK);
strcpy(item_n[i++],_com_util::ConvertBSTRToString(pName));
//item_n[i++] = _com_util::ConvertBSTRToString(pName);
}
if (FAILED(r2)) {
MessageBox(NULL,"Next Error","Error",MB_OK);
}
pEnum->Release();
}
else {
MessageBox(NULL,"NULL!","Alarm",MB_OK);
}
}
}
/*
//---------------------------------------------------------
// BrowseLevel
// 建立树状的地址空间
//---------------------------------------------------------
void CBrowserDlg::BrowseLevel(HTREEITEM gParent,CString FullName,IOPCBrowseServerAddressSpace *pIOPCBrowse)
{
HRESULT r1;
IEnumString * pEnum;
TV_INSERTSTRUCT tvstruct;
// Query for the Browser Interface
OPCBROWSETYPE brType ;
LPCWSTR szFilt = L"*";
VARTYPE vtFilt;
DWORD arFilt;
vtFilt = VT_EMPTY;
if(m_AccessRight== 0)
{
arFilt= OPC_ACCESS_READ;
}
else if(m_AccessRight==1)
{
arFilt=OPC_ACCESS_WRITE;
}
if(m_BrType==0)
{
brType=OPC_BRANCH;
// (1) Browse Branches
r1 = pIOPCBrowse->BrowseOPCItemIDs(brType, szFilt, vtFilt, arFilt, &pEnum);
if (FAILED(r1))
{
AfxMessageBox("BrowseOPCItemIDs错误");
}
else
{
HRESULT r2 = S_OK;
ULONG actual;
LPOLESTR pStr;
HTREEITEM Parent=NULL;
if (pEnum)
{
while((r2 = pEnum->Next(1, &pStr, &actual)) == S_OK)
{
tvstruct.hParent = gParent;
tvstruct.hInsertAfter = TVI_SORT;
tvstruct.item.pszText = _com_util::ConvertBSTRToString(pStr);
tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
Parent=m_MyTree.InsertItem(&tvstruct);
HRESULT r3 = S_OK;
r3 = pIOPCBrowse->ChangeBrowsePosition(
OPC_BROWSE_DOWN, pStr);
if (FAILED(r3))
{
AfxMessageBox("ChangeBrowsePosition(BROWSE_DOWN)错误");
}
else
{
BrowseLevel(Parent,FullName + (LPWSTR)LPCTSTR(pStr),pIOPCBrowse);
}
pIMalloc->Free(pStr);
// Free the string(s) that Next Returned
}
if (FAILED(r2))
{
AfxMessageBox("Next错误");
}
pEnum->Release();
// Release the interface
}
else
{
AfxMessageBox("空的分支!");
}
}
brType = OPC_LEAF;
// (1) Browse Leaves
r1 = pIOPCBrowse->BrowseOPCItemIDs(brType, szFilt, vtFilt, arFilt, &pEnum);
if (FAILED(r1))
{
AfxMessageBox("BrowseOPCItemIDs错误");
}
else
{
HRESULT r2 = S_OK;
LPOLESTR pStr;
LPOLESTR pName;
ULONG actual;
// Got an IEnumString with Leaves...
if (pEnum) {
while((r2 = pEnum->Next(1, &pStr, &actual)) == S_OK) {
tvstruct.hParent = gParent;
tvstruct.hInsertAfter = TVI_SORT;
pIOPCBrowse->GetItemID(pStr, &pName);
tvstruct.item.pszText = _com_util::ConvertBSTRToString(pName);
tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
m_MyTree.InsertItem(&tvstruct);
pIMalloc->Free(pStr);
}
if (FAILED(r2)) {
AfxMessageBox("Next错误");
}
pEnum->Release();
// Release the interface
}
else {
AfxMessageBox("空的分支");
}
}
HRESULT r3 = S_OK;
r3 = pIOPCBrowse->ChangeBrowsePosition( OPC_BROWSE_UP, L"");
}
else if(m_BrType==1)
{
brType = OPC_FLAT;
// (1) Browse Leaves
r1 = pIOPCBrowse->BrowseOPCItemIDs(brType, szFilt, vtFilt, arFilt, &pEnum);
if (FAILED(r1))
{
AfxMessageBox("BrowseOPCItemIDs错误");
}
else
{
HRESULT r2 = S_OK;
LPOLESTR pStr;
LPOLESTR pName;
ULONG actual;
//Got an IEnumString with Leaves...
if (pEnum) {
while((r2 = pEnum->Next(1, &pStr, &actual)) == S_OK) {
tvstruct.hParent = gParent;
tvstruct.hInsertAfter = TVI_SORT;
pIOPCBrowse->GetItemID(pStr, &pName);
tvstruct.item.pszText = _com_util::ConvertBSTRToString(pName);
tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
m_MyTree.InsertItem(&tvstruct);
pIMalloc->Free(pStr);
// Free the string(s) that Next Returned
}
if (FAILED(r2)) {
AfxMessageBox("Next错误");
}
pEnum->Release();
// Release the interface
}
else {
AfxMessageBox("空的分支");
}
}
}
}
void CBrowserDlg::OnStartButton()
{
// TODO: Add your control notification handler code here
CWaitCursor wait;
pIOPCBrowse = CreateOPCBrowser(L"Matrikon.OPC.Simulation");
m_MyTree.DeleteAllItems( );
BrowseLevel(0,L"",pIOPCBrowse);
if(pIOPCBrowse)
{
pIOPCBrowse->Release();
pIOPCBrowse=NULL;
}
if(pIOPCServer)
{
pIOPCServer->Release();
pIOPCServer=NULL;
}
}
void CBrowserDlg::OnSelchangeAccessrightCombo()
{
// TODO: Add your control notification handler code here
m_AccessRight = m_AccessRightCtrl.GetCurSel();
}
void CBrowserDlg::OnSelchangeBrowsefiltertypeCombo()
{
// TODO: Add your control notification handler code here
m_BrType = m_BrTypeCtrl.GetCurSel();
}
void CBrowserDlg::OnSelchangeDatatypeCombo()
{
// TODO: Add your control notification handler code here
m_DataType = m_DataTypeCtrl.GetCurSel();
}
void CBrowserDlg::OnClickItemidTree(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -