/// <summary>
        /// Converts an array of .NET SourceServer objects to COM SourceServer structures.
        /// </summary>
        internal static OpcRcw.Dx.SourceServer[] GetSourceServers(SourceServer[] input)
        {
            OpcRcw.Dx.SourceServer[] output = null;

            if (input != null && input.Length > 0)
            {
                output = new OpcRcw.Dx.SourceServer[input.Length];

                for (int ii = 0; ii < input.Length; ii++)
                {
                    output[ii] = new OpcRcw.Dx.SourceServer();

                    output[ii].dwMask        = (uint)OpcRcw.Dx.Mask.All;
                    output[ii].szItemName    = input[ii].ItemName;
                    output[ii].szItemPath    = input[ii].ItemPath;
                    output[ii].szVersion     = input[ii].Version;
                    output[ii].szName        = input[ii].Name;
                    output[ii].szDescription = input[ii].Description;
                    output[ii].szServerType  = input[ii].ServerType;
                    output[ii].szServerURL   = input[ii].ServerURL;
                    output[ii].bDefaultSourceServerConnected = (input[ii].DefaultConnected)?1:0;
                }
            }

            return(output);
        }
        /// <summary>
        /// Converts an array of COM SourceServer structures to .NET SourceServer objects.
        /// </summary>
        internal static SourceServer[] GetSourceServers(ref IntPtr pInput, int count, bool deallocate)
        {
            SourceServer[] output = null;

            if (pInput != IntPtr.Zero && count > 0)
            {
                output = new SourceServer[count];

                IntPtr pos = pInput;

                for (int ii = 0; ii < count; ii++)
                {
                    OpcRcw.Dx.SourceServer server = (OpcRcw.Dx.SourceServer)Marshal.PtrToStructure(pos, typeof(OpcRcw.Dx.SourceServer));

                    output[ii] = new SourceServer();

                    output[ii].ItemName         = server.szItemName;
                    output[ii].ItemPath         = server.szItemPath;
                    output[ii].Version          = server.szVersion;
                    output[ii].Name             = server.szName;
                    output[ii].Description      = server.szDescription;
                    output[ii].ServerType       = server.szServerType;
                    output[ii].ServerURL        = server.szServerURL;
                    output[ii].DefaultConnected = server.bDefaultSourceServerConnected != 0;

                    pos = (IntPtr)(pos.ToInt64() + Marshal.SizeOf(typeof(OpcRcw.Dx.SourceServer)));
                }

                if (deallocate)
                {
                    Marshal.FreeCoTaskMem(pInput);
                    pInput = IntPtr.Zero;
                }
            }

            return(output);
        }