Xcvdata () to remove a port.
BOOL DeletePortCus( TCHAR* PortName ) { HANDLE hPrinter; PRINTER_DEFAULTS PrinterDefaults; memset(&PrinterDefaults, 0, sizeof(PrinterDefaults)); PrinterDefaults.pDatatype = NULL; PrinterDefaults.pDevMode = NULL; PrinterDefaults.DesiredAccess = SERVER_ACCESS_ADMINISTER; DWORD needed = 0; DWORD rslt = 0; //Port data PORT_DATA_1 pOutputData ; DWORD error = 0; if (!OpenPrinter(L",XcvMonitor Standard TCP/IP Port", &hPrinter, &PrinterDefaults)) { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), NULL,(LPTSTR) &lpMsgBuf, 0, NULL ); _tprintf( TEXT("Error in OpenPrinter. Error msg : %s"),lpMsgBuf); LocalFree( lpMsgBuf ); return FALSE; } DWORD xcvresult= 0; if ( !XcvData( hPrinter, TEXT("DeletePort"), (PBYTE)PortName, (lstrlen(PortName) +1) * sizeof(TCHAR), //the 1 is for the trailing NULL ( byte * ) &pOutputData, sizeof(PORT_DATA_1), &needed, &xcvresult) ) { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), NULL,(LPTSTR) &lpMsgBuf, 0, NULL ); _tprintf( TEXT("Error in XcvData. Error msg : %s; XcvDataPort status val = %d"), lpMsgBuf, xcvresult); LocalFree( lpMsgBuf ); return FALSE; } ClosePrinter(hPrinter); return TRUE; }
The highlight are both functions ( openprinter , and xcvdata strong>). But the port is not deleted. I am completely at a loss because I have no errors to search.
Instead ,XcvMonitor Standard TCP/IP Port I also tried the ,XcvMonitor Standard TCP/IP Port with ,XcvPort <portname> . Nonetheless. As Samer suggested below, I tried using OpenPrinter2 without the caching option.
PS: I know this is a simple alternative to DeletePort (), but it brings up a user interface dialog if it doesn't work, so I don't want to use it.