Removing a standard TCP IP port using xcvdata does not work

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.

+5
source share
1 answer

It seems that the problem may be related to a specific version of the OS that caches printer descriptors. To get around this, you use an alternative OpenPrinter2 call with PRINTER_OPTION_NO_CACHE . Below is a modified code with the flag set.

 HANDLE hPrinter; PRINTER_DEFAULTS PrinterDefaults; memset(&PrinterDefaults, 0, sizeof(PrinterDefaults)); PrinterDefaults.pDatatype = NULL; PrinterDefaults.pDevMode = NULL; PrinterDefaults.DesiredAccess = SERVER_ACCESS_ADMINISTER; PRINTER_OPTIONS PrinterOptions; PrinterOptions.cbSize = sizeof(PrinterOptions); PrinterOptions.dwFlags = PRINTER_OPTION_NO_CACHE; DWORD needed = 0; DWORD rslt = 0; //Port data PORT_DATA_1 pOutputData ; DWORD error = 0; if (!OpenPrinter2(L",XcvMonitor Standard TCP/IP Port", &hPrinter, &PrinterDefaults, &PrinterOptions)) { LPVOID lpMsgBuf; 
0
source

Source: https://habr.com/ru/post/1270484/


All Articles