Eterlogic virtual serial ports emulator

C# (COM interface)

Add reference to VSPE_ComServer.dll (CLSID=D7CD1EF7-A520-457B-AF9A-8EA103B95381).

Or if VSPE is already installed and VSPE_ComServer component is registered with regsvr32 tool just add reference to VSPE COM component as shown below:

api_reference_com.png

Adding reference to VSPE COM server

Form1.cs

using System;
using System.ServiceProcess;
using System.Text;
using System.Windows.Forms;
using VSPELib;

namespace VSPE_API_Test
{
    public partial class Form1 : Form
    {
        private VSPEApi _vspe;

        const string VspeActivationKey = ""; // <-----  PUT ACTIVATION KEY HERE
        const string VspeServiceName = "EterlogicVspeDeviceManagerService"; // VSPE service. If it is running, API will not work, so in this sample we validate if it is running before trying to initialize VSPE.
        const int InitialComPortNumberForNewDevice = 5;
        const int MaxComPortNumberForNewDevice = 256;

        private int _nextVirtualComPortNumber = InitialComPortNumberForNewDevice;

        public Form1()
        {
            InitializeComponent();
        }

        bool IsVspeServiceRunning()
        {
            using (ServiceController service = new ServiceController(VspeServiceName))
            {
                return service.Status == ServiceControllerStatus.Running;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Check if VSPE service is running
            if (IsVspeServiceRunning())
            {
                MessageBox.Show($"{VspeServiceName} is running. Please stop it before trying to use VSPE API");
                this.Close();
                return;
            }

            _vspe = new VSPEApi();

            // display VSPE API info
            label1.Text = _vspe.vspe_getVersionInformation();

            // activate VSPE API
            if (_vspe.vspe_activate(VspeActivationKey) == 0)
            {
                // failed to activate!
                MessageBox.Show("Failed to activate with error: " + _vspe.vspe_getActivationError());
                return;
            }

            // initialize API
            if (_vspe.vspe_initialize() == 0)
            {
                // failed to activate!
                MessageBox.Show("Failed to initialize");
                return;
            }

            RefreshDevicesList();
        }

        private void RefreshDevicesList()
        {
            if (_vspe == null)
                return;

            listBoxDevices.Items.Clear();

            // get devices count
            int count = _vspe.vspe_getDevicesCount();

            // enumerate devices
            for (int idx = 0; idx < count; ++idx)
            {
                // get device ID
                string name, initString;
                int ok, used;
                if (_vspe.vspe_getDeviceInfo(idx, out name, out initString, out ok, out used) == 0)
                {
                    MessageBox.Show($"Failed to get information about device {idx}");
                    return;
                }

                var itemTitle = name + " (" + initString + ") OK=" + ok.ToString() + "\n";
                listBoxDevices.Items.Add(itemTitle);
            }
        }

        private void CreateDevice_Click(object sender, EventArgs e)
        {
            if (_vspe == null)
                return;

            // Add new Connector device with next COM port number
            // To see actual parameters, run VSPE and just open right panel in VSPE and click on any device
            // This function returns deviceIndex which you can use later. -1 on error.
            int deviceIndex = _vspe.vspe_createDevice("Connector", $"{_nextVirtualComPortNumber++};0");
            if (deviceIndex == -1)
            {
                MessageBox.Show("Failed to create new device");
            }

            if (_nextVirtualComPortNumber == MaxComPortNumberForNewDevice)
            {
                _nextVirtualComPortNumber = InitialComPortNumberForNewDevice;
            }

            RefreshDevicesList();
        }

        private void buttonDeleteAllDevices_Click(object sender, EventArgs e)
        {
            if (_vspe == null)
                return;

            if (_vspe.vspe_destroyAllDevices() == 0)
            {
                MessageBox.Show("Failed to delete all devices");
            }

            RefreshDevicesList();
        }

        private void buttonDeleteSelectedDevice_Click(object sender, EventArgs e)
        {
            if (_vspe == null)
                return;

            int idx = listBoxDevices.SelectedIndex;
            if (idx == -1)
                return; // nothing selected

            if (_vspe.vspe_destroyDevice(idx) == 0)
            {
                MessageBox.Show($"Failed to delete device with idx={idx}");
            }

            RefreshDevicesList();
        }

        private void buttonRefresh_Click(object sender, EventArgs e)
        {
            RefreshDevicesList();
        }

        private void OnClosing(object sender, FormClosingEventArgs e)
        {
            if (_vspe == null)
                return;

            // Stop emulation
            _vspe.vspe_destroyAllDevices();

            // Release VSPE
            _vspe.vspe_release();
        }
    }
}

2007-2025 Eterlogic Software