You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
7.7 KiB
C#
204 lines
7.7 KiB
C#
namespace OPC
|
|
{
|
|
using OPC.Common;
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Security;
|
|
using System.Security.Permissions;
|
|
|
|
[SuppressUnmanagedCodeSecurity, ComVisible(true), ReflectionPermission(SecurityAction.Assert, Unrestricted=true), SecurityPermission(SecurityAction.Assert, UnmanagedCode=true)]
|
|
public class OpcServerBrowser
|
|
{
|
|
private Guid CLSID_OPCEnum;
|
|
private IOPCServerList ifSrvList;
|
|
|
|
public OpcServerBrowser()
|
|
{
|
|
this.ifSrvList = null;
|
|
this.CLSID_OPCEnum = new Guid("{13486D51-4821-11D2-A494-3CB306C10000}");
|
|
Type typeFromCLSID = Type.GetTypeFromCLSID(this.CLSID_OPCEnum);
|
|
this.ifSrvList = (IOPCServerList) Activator.CreateInstance(typeFromCLSID);
|
|
}
|
|
|
|
public OpcServerBrowser(Host host)
|
|
{
|
|
this.ifSrvList = null;
|
|
this.CLSID_OPCEnum = new Guid("{13486D51-4821-11D2-A494-3CB306C10000}");
|
|
if ((host.HostName != null) && (host.HostName != ""))
|
|
{
|
|
this.ifSrvList = (IOPCServerList) ComApi.CreateInstance(this.CLSID_OPCEnum, host);
|
|
}
|
|
else
|
|
{
|
|
Type typeFromCLSID = Type.GetTypeFromCLSID(this.CLSID_OPCEnum);
|
|
this.ifSrvList = (IOPCServerList) Activator.CreateInstance(typeFromCLSID);
|
|
}
|
|
}
|
|
|
|
public OpcServerBrowser(string ComputerName)
|
|
{
|
|
this.ifSrvList = null;
|
|
this.CLSID_OPCEnum = new Guid("{13486D51-4821-11D2-A494-3CB306C10000}");
|
|
if ((ComputerName != null) && (ComputerName != ""))
|
|
{
|
|
Host host = new Host();
|
|
host.HostName = ComputerName;
|
|
this.ifSrvList = (IOPCServerList) ComApi.CreateInstance(this.CLSID_OPCEnum, host);
|
|
}
|
|
else
|
|
{
|
|
Type typeFromCLSID = Type.GetTypeFromCLSID(this.CLSID_OPCEnum);
|
|
this.ifSrvList = (IOPCServerList) Activator.CreateInstance(typeFromCLSID);
|
|
}
|
|
}
|
|
|
|
public int CLSIDFromProgID(string progId, out Guid clsid)
|
|
{
|
|
int hresultcode = this.ifSrvList.CLSIDFromProgID(progId, out clsid);
|
|
if (HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, "CLSIDFromProgID failed with error " + ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
internal int EnumClassesOfCategories(int catListLength, Guid[] catList, int reqListLenght, Guid[] reqList, out object enumtemp)
|
|
{
|
|
int hresultcode = this.ifSrvList.EnumClassesOfCategories(catListLength, catList, reqListLenght, reqList, out enumtemp);
|
|
if (HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, "EnumClassesOfCategories failed with error " + ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
~OpcServerBrowser()
|
|
{
|
|
if (this.ifSrvList != null)
|
|
{
|
|
Marshal.ReleaseComObject(this.ifSrvList);
|
|
this.ifSrvList = null;
|
|
}
|
|
}
|
|
|
|
public int GetClassDetails(ref Guid clsid, out string progID, out string userType)
|
|
{
|
|
int hresultcode = this.ifSrvList.GetClassDetails(ref clsid, out progID, out userType);
|
|
if (HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, "GetClassDetails failed with error " + ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
public void GetServerList(out string[] Servers)
|
|
{
|
|
Guid[] catList = new Guid[] { new Guid("{63D5F432-CFE4-11d1-B2C8-0060083BA1FB}"), new Guid("{63D5F430-CFE4-11d1-B2C8-0060083BA1FB}"), new Guid("{CC603642-66D7-48f1-B69A-B625E73652D7}") };
|
|
this.GetServerList(catList, out Servers);
|
|
}
|
|
|
|
public void GetServerList(Guid[] catList, out string[] Servers)
|
|
{
|
|
Guid[] guidArray;
|
|
this.GetServerList(catList, out Servers, out guidArray);
|
|
guidArray = null;
|
|
}
|
|
|
|
public void GetServerList(out string[] Servers, out Guid[] ClsIDs)
|
|
{
|
|
Guid[] catList = new Guid[] { new Guid("{63D5F432-CFE4-11d1-B2C8-0060083BA1FB}"), new Guid("{63D5F430-CFE4-11d1-B2C8-0060083BA1FB}"), new Guid("{CC603642-66D7-48f1-B69A-B625E73652D7}") };
|
|
this.GetServerList(catList, out Servers, out ClsIDs);
|
|
}
|
|
|
|
public void GetServerList(bool V2, bool V3, out string[] Servers)
|
|
{
|
|
Guid[] catList = null;
|
|
if (!V2 && !V3)
|
|
{
|
|
Servers = new string[0];
|
|
}
|
|
else
|
|
{
|
|
if (V2 && V3)
|
|
{
|
|
catList = new Guid[] { new Guid("{63D5F432-CFE4-11d1-B2C8-0060083BA1FB}"), new Guid("{CC603642-66D7-48f1-B69A-B625E73652D7}") };
|
|
}
|
|
else if (V2)
|
|
{
|
|
catList = new Guid[] { new Guid("{63D5F432-CFE4-11d1-B2C8-0060083BA1FB}") };
|
|
}
|
|
else if (V3)
|
|
{
|
|
catList = new Guid[] { new Guid("{CC603642-66D7-48f1-B69A-B625E73652D7}") };
|
|
}
|
|
this.GetServerList(catList, out Servers);
|
|
}
|
|
}
|
|
|
|
public void GetServerList(Guid[] catList, out string[] Servers, out Guid[] ClsIDs)
|
|
{
|
|
object obj2;
|
|
Servers = null;
|
|
ClsIDs = null;
|
|
if (this.ifSrvList == null)
|
|
{
|
|
throw new OPCException(-2147467262, "GetServerList failed with error code {hr}");
|
|
}
|
|
this.ifSrvList.EnumClassesOfCategories(catList.Length, catList, 0, null, out obj2);
|
|
if (obj2 != null)
|
|
{
|
|
IEnumGUID o = (IEnumGUID) obj2;
|
|
obj2 = null;
|
|
o.Reset();
|
|
int index = 0;
|
|
Guid rgelt = this.CLSID_OPCEnum;
|
|
Guid[] guidArray = new Guid[50];
|
|
int pceltFetched = 0;
|
|
do
|
|
{
|
|
o.Next(1, ref rgelt, out pceltFetched);
|
|
if (pceltFetched > 0)
|
|
{
|
|
guidArray[index] = rgelt;
|
|
index++;
|
|
}
|
|
}
|
|
while ((pceltFetched > 0) && (index < guidArray.Length));
|
|
Marshal.ReleaseComObject(o);
|
|
o = null;
|
|
string[] strArray = new string[index];
|
|
Guid[] guidArray2 = new Guid[index];
|
|
int num3 = 0;
|
|
for (int i = 0; i < index; i++)
|
|
{
|
|
string ppszProgID = null;
|
|
string ppszUserType = null;
|
|
try
|
|
{
|
|
this.ifSrvList.GetClassDetails(ref guidArray[i], out ppszProgID, out ppszUserType);
|
|
strArray[num3] = ppszProgID;
|
|
guidArray2[num3] = guidArray[i];
|
|
num3++;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
if (num3 > 0)
|
|
{
|
|
Servers = new string[num3];
|
|
ClsIDs = new Guid[num3];
|
|
for (int j = 0; j < num3; j++)
|
|
{
|
|
Servers[j] = strArray[j];
|
|
ClsIDs[j] = guidArray2[j];
|
|
}
|
|
}
|
|
strArray = null;
|
|
guidArray2 = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|