使用xcvdata不起作用删除标准TCP IP端口

Xcvdata()删除端口。

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; } 

亮点是两个函数( openprinterxcvdata )都成功了。 但港口并没有被删除。 我完全不知所措,因为我没有任何错误要查找。

而不是,XcvMonitor Standard TCP/IP Port我也试过,XcvPort <portname> 。 还是一样。 正如下面的Samerbuild议的那样,我尝试使用OpenPrinter2而没有caching选项。

PS:我知道有这个简单的替代DeletePort(),但它会调用一个UI对话框,如果它失败了,所以我不想使用它。

看来问题可能与缓存打印机句柄的特定OS版本有关。 为了解决这个问题,可以使用PRINTER_OPTION_NO_CACHE替代调用OpenPrinter2 。 以下是设置了标志的修改后的代码。

 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;