• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 3124
  • Last Modified:

XcvData - to add port

I want to add a port without a dialog using XcvData winapi function. The problem is it returns invalid handle for 1st parameter which requires a printer handle, but i do not have a printer installed.
0
bansaldeep
Asked:
bansaldeep
1 Solution
 
cookreCommented:
That's a print spooler call back.  And, yes, the first parm is a handle to an extant, open printer.

Are you sure you don't want AddPort()?
0
 
bansaldeepAuthor Commented:
Yes I am sure because i don't want a dialog for adding a port.
0
 
adebear71Commented:
There is currently nothing on the Internet (I have found) about doing this, I would have thought more people would have looked into this. I could only find this way to do it.
Hack the registry and restart the print spooler

 To add an extra LPT port add a new string named LPT3 (or next LPT port) to
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports with
a Blank value. Restart the Print Spooler and viola.

For a TCP/IP port look add one to your local machine (point to 127.0.0.1) and pick defaults and check the registry
entries in
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_127.0.0.1

hack these to your liking, restart print spooler and viola..

I had to do this for a project I needed to add a new port.



0
 
cookreCommented:
Sounds like a perfectly reasonable solution.
0
 
pscsukCommented:
On the other hand, try this...

#include <windows.h>

#include <stdio.h>
int main(void)
{
      DWORD dwNeeded;
      DWORD dwStatus;
      WCHAR PortName[100];

      HANDLE hPrinter;
      PRINTER_DEFAULTS PrinterDefaults;

      PrinterDefaults.pDatatype = NULL;
      PrinterDefaults.pDevMode = NULL;
      PrinterDefaults.DesiredAccess = SERVER_ACCESS_ADMINISTER;
      
      if (!OpenPrinter(",XcvMonitor Local Port", &hPrinter, &PrinterDefaults))
      {
            printf("OpenPrinter failed - %d\n", GetLastError());
            return -1;
      }

      lstrcpyW(PortName, L"MyPort3");
      if (!XcvData(hPrinter, L"AddPort", (BYTE *)PortName, (lstrlenW(PortName) + 1) * 2, NULL, 0, &dwNeeded, &dwStatus))
      {
            printf("XcvData failed - %d\n", GetLastError());
      }
      if (dwStatus != 0)
      {
            printf("XcvData - Returned %lu\n", dwStatus);
      }

      if (!ClosePrinter(hPrinter))
      {
            printf("ClosePrinter failed - %lu\n", GetLastError());
      }

      return 0;
}

This will add a 'Local Port' port
See http://www.osr.com/ddk/graphics/provider_7a5j.htm for how to add a TCP/IP port

(This is the 'proper' way to do it - according to Microsoft)

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: CompTIA Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now