You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#/Delphi/Java中编程创建可用于打印机的虚拟串口

How to Create Virtual Serial Ports That Appear in "Ports (COM & LPT)" for Printer Use (C#/Delphi/Java)

The core issue with com0com is that it registers its virtual ports under a custom device class instead of the standard Windows Ports Class (GUID: {4D36E978-E325-11CE-BFC1-08002BE10318}). To get ports visible in the printer port list and Device Manager's standard ports section, you need to create virtual ports that adhere to this standard class.

Here's how to implement this across your target languages:

Prerequisite: Use a Standard-Class Virtual Serial Port Driver

You'll need a driver/SDK that creates ports registered under the standard Ports class. Popular options include:

  • Eltima Virtual Serial Port Driver (VSPD) with its SDK (supports programmatic creation for C#/Delphi/Java)
  • Virtual Serial Port Driver SDK (similar to Eltima, focused on developer integration)
  • Avoid custom drivers like com0com unless you're willing to hack registry settings (not recommended for production)

1. C# Implementation (Eltima VSPD SDK)

First, install the Eltima VSPD SDK and reference the Eltima.VirtualPortSDK assembly in your project:

using Eltima.VirtualPortSDK;
using System;

class VirtualPrinterPortCreator
{
    static void Main(string[] args)
    {
        // Initialize SDK (replace with your license key; trial keys work for testing)
        if (!VirtualPortSdk.Initialize("YOUR_LICENSE_KEY"))
        {
            Console.WriteLine($"SDK Init Failed: {VirtualPortSdk.GetLastError()}");
            return;
        }

        // Create a pair of standard-class virtual ports (COM10 ↔ COM11)
        string printerPort = "COM10";
        string pairedPort = "COM11";
        
        if (VirtualPortSdk.CreatePair(printerPort, pairedPort, VirtualPortSdk.PortFlags.PORT_FLAGS_STANDARD))
        {
            Console.WriteLine($"Successfully created ports: {printerPort} (use this for your printer) and {pairedPort}");
            // You'll now see these ports in Device Manager → Ports (COM & LPT)
        }
        else
        {
            Console.WriteLine($"Port Creation Failed: {VirtualPortSdk.GetLastError()}");
        }

        VirtualPortSdk.Deinitialize();
    }
}

2. Delphi Implementation (VSPD COM API)

Delphi can use the VSPD COM component to create ports directly:

uses
  ComObj, SysUtils;

procedure CreateVirtualPrinterPort;
var
  VSPDCreator: OleVariant;
  PrinterPort, PairedPort: string;
begin
  try
    // Create instance of VSPD's COM creator
    VSPDCreator := CreateOleObject('VSPD.Creator');
    
    PrinterPort := 'COM12';
    PairedPort := 'COM13';
    
    // Create standard-class port pair (0 = standard class flag)
    VSPDCreator.CreatePair(PrinterPort, PairedPort, 0);
    
    Writeln('Success! Use ', PrinterPort, ' as your printer port.');
  except
    on E: Exception do
      Writeln('Error creating ports: ', E.Message);
  end;
end;

begin
  CreateVirtualPrinterPort;
  Readln;
end.

3. Java Implementation (Command-Line Wrapper for VSPD)

Java doesn't have direct access to Windows device APIs, so we'll call VSPD's command-line tool vspdctl.exe:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class VirtualSerialPortSetup {
    public static void main(String[] args) {
        String printerPort = "COM14";
        String pairedPort = "COM15";
        String vspdCtlPath = "C:\\Program Files\\Eltima Software\\Virtual Serial Port Driver\\vspdctl.exe";

        // Build command to create standard-class port pair
        String command = String.format("%s create %s %s", vspdCtlPath, printerPort, pairedPort);

        try {
            Process process = Runtime.getRuntime().exec(command);
            BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

            // Print output/errors
            String line;
            System.out.println("Command Output:");
            while ((line = inputReader.readLine()) != null) {
                System.out.println(line);
            }
            System.err.println("Error Output:");
            while ((line = errorReader.readLine()) != null) {
                System.err.println(line);
            }

            int exitCode = process.waitFor();
            if (exitCode == 0) {
                System.out.println("\nPort created successfully: " + printerPort + " (ready for printer setup)");
            } else {
                System.err.println("\nPort creation failed. Exit code: " + exitCode);
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Post-Creation: Set Up the Printer

Once your virtual port is created:

  1. Open Settings → Bluetooth & Devices → Printers & Scanners
  2. Click Add device, select Add manually
  3. Choose Use an existing port, pick your virtual COM port (e.g., COM10), then follow the wizard to install your printer driver.

If you insist on using com0com, you can modify its registry entries to switch to the standard Ports class:

  1. Open regedit and navigate to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\<com0com-device-id> (find your device's path via Device Manager)
  2. Change the ClassGUID value to {4D36E978-E325-11CE-BFC1-08002BE10318}
  3. Restart your PC. The ports will now appear in the standard section, but this can cause driver instability and isn't recommended for production.

内容的提问来源于stack exchange,提问作者amin yaghoti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:47:02