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

标签 c++ windows

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

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

最佳答案

看来问题可能与缓存打印机句柄的特定操作系统版本有关。要解决此问题,您可以使用带有 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;

关于c++ - 使用 xcvdata 删除标准 TCP IP 端口不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459293/

相关文章:

c++ - 内置数组类型的开始和结束函数

c++ - 智能感知 : no instance of constructor "Sock::Connection::Connection" matches the argument list C++

c++ - 初始化列表中积分提升的规则是什么?这是 GCC 还是 C++ 限制中的误报警告?

c# - C# 应用程序中的 Environment.FailFast

c++ - 使用 MSWin 资源(对话框/菜单/字符串)进行国际化

c++ - "mutex"和 "lock"有什么区别?

c++ - 我将如何使用 Bullet Physics Library 设置碰撞?

r - Boom 软件包未安装在 PC 上

windows - SetSecurityInfo 因 PROCESS_TERMINATE 而失败

c++ - 无法在 Windows 10 上安装的 Cuda 工具包 v7.5 上找到 deviceQuery