public OPCServerLister() { m_OPCListObj = null; m_IfList = null; m_EnumObj = null; m_IfEnum = null; }
public void ListAllOnMachine(Guid p_CatID, string p_MachineName, out OPCServerInfo[] p_ServersList) { p_ServersList = null; Dispose(); Guid l_Guid = new Guid("13486D51-4821-11D2-A494-3CB306C10000"); Type l_TypeOfList = Type.GetTypeFromCLSID(l_Guid, p_MachineName); m_OPCListObj = Activator.CreateInstance(l_TypeOfList); m_IfList = (IOPCServerList)m_OPCListObj; if (m_IfList == null) { Marshal.ThrowExceptionForHR(HResults.E_ABORT); } m_IfList.EnumClassesOfCategories(1, ref p_CatID, 0, ref p_CatID, out m_EnumObj); if (m_EnumObj == null) { Marshal.ThrowExceptionForHR(HResults.E_ABORT); } m_IfEnum = (IEnumGuid)m_EnumObj; if (m_IfEnum == null) { Marshal.ThrowExceptionForHR(HResults.E_ABORT); } int l_MaxCount = 300; IntPtr l_PtrGuid = Marshal.AllocCoTaskMem(l_MaxCount * 16); int l_Count = 0; m_IfEnum.Next(l_MaxCount, l_PtrGuid, out l_Count); if (l_Count < 1) { Marshal.FreeCoTaskMem(l_PtrGuid); return; } p_ServersList = new OPCServerInfo[l_Count]; byte[] l_GuidBin = new byte[16]; int l_RunGuid = (int)l_PtrGuid; for (int i = 0; i < l_Count; ++i) { p_ServersList[i] = new OPCServerInfo(); Marshal.Copy((IntPtr)l_RunGuid, l_GuidBin, 0, 16); p_ServersList[i].ClsID = new Guid(l_GuidBin); m_IfList.GetClassDetails(ref p_ServersList[i].ClsID, out p_ServersList[i].ProgID, out p_ServersList[i].ServerName); l_RunGuid += 16; } Marshal.FreeCoTaskMem(l_PtrGuid); Dispose(); }
public void Dispose() { m_IfEnum = null; if (m_EnumObj != null) { Marshal.ReleaseComObject(m_EnumObj); m_EnumObj = null; } m_IfList = null; if (m_OPCListObj != null) { Marshal.ReleaseComObject(m_OPCListObj); m_OPCListObj = null; } }