Удаление стандартного IP-порта TCP с использованием xcvdata не работает

106
9

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


Изюминкой являются как функции ( openprinter, так и xcvdata​​strong > ). Но порт не удаляется. Я полностью в недоумении, потому что у меня нет ошибок для поиска.


Вместо ,XcvMonitor Standard TCP/IP Port я также попытался с ,XcvPort <portname>. Тем не менее.
Как предложил Самер ниже, я попытался использовать OpenPrinter2 без опции кэширования.


PS: Я знаю, что эта простая альтернатива DeletePort(), но она вызывает диалоговое окно интерфейса пользователя, если оно не работает, поэтому я не хочу его использовать.

спросил(а) 2021-01-19T15:21:43+03:00 2 месяца, 3 недели назад
1
Решение
114

Кажется, проблема может быть связана с конкретной версией ОС, которая кэширует дескрипторы принтера. Чтобы обойти это, вы используете альтернативный вызов OpenPrinter2 с помощью PRINTER_OPTION_NO_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;

ответил(а) 2021-01-19T15:21:43+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема