⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opc_client.cpp

📁 SCILab的OPC扩展包, SCILab编程大赛获奖作品.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	// 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 + -