C++ 使用xcvdata删除标准TCP IP端口不工作

C++ 使用xcvdata删除标准TCP IP端口不工作,c++,windows,C++,Windows,用于删除端口的Xcvdata() BOOL DeletePortCus( TCHAR* PortName ) { HANDLE hPrinter; PRINTER_DEFAULTS PrinterDefaults; memset(&PrinterDefaults, 0, sizeof(PrinterDefaults)); PrinterDefaults.pDatatype = NULL; PrinterDefaults.pDevMod

用于删除端口的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标准TCP/IP端口
,我还尝试了
,XcvPort
。还是一样。 正如Samer在下面建议的那样,我尝试了使用
OpenPrinter2
,但没有缓存选项


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

似乎这个问题可能与缓存打印机句柄的特定版本的操作系统有关。要解决这个问题,您可以使用另一个调用
OpenPrinter2
PRINTER\u选项\u NO\u CACHE
。下面是设置了标志的修改代码

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;

你提到你不知道它什么时候停止工作,可能回到操作系统版本等等,直到它最后一次工作或者什么时候重新开始工作。然后,您可以开始浏览发行说明和版本以后可能影响代码的更改。您还提到功能成功,但端口未关闭。您如何知道它没有被删除?您是否可以尝试在没有最后一个参数的情况下使用
XcvDataPort
&xcvresult,以查看它是否给出相同的结果?@n识别打印机端口的方法很少。一种方法是从run使用printmanagement.msi,它列出了所有可用的打印机端口、打印机和驱动程序,@samer我明天会尝试并在这里更新。但两者之间有什么区别呢?检查了MSDN页面上的两个函数,但就我所能理解的而言,除了参数之外,它没有提到任何区别。盲镜头:您是否在提升模式下运行此功能?管理员帐户?正如你所建议的,我尝试使用XcvDataPort而不是XcvData,但该函数似乎已从本机库中删除,因为我遇到了未解决的外部符号错误。我已经包括了winsplp.h。我尝试添加winsplp.lib,但它不可用。winsplp.h的其他函数也未解析。