Дополнительно к функции WinAPI::EnumPrinters создайте еще одну:
X++:
static client server str GetPrinterPort(str _printerName)
{
DLL _winApiDLL = new DLL("kernel32.dll");
DLLFunction _getProfileString = new DLLFunction(_winApiDLL, 'GetProfileStringA');
Binary _bStrApp = new Binary(10);
Binary _bStrKey = new Binary(255);
Binary _bStrDef = new Binary(1);
Binary _bStrRet = new Binary(255);
;
_getProfileString.returns(ExtTypes::DWord);
_getProfileString.arg( ExtTypes::Pointer,
ExtTypes::Pointer,
ExtTypes::Pointer,
ExtTypes::Pointer,
ExtTypes::DWord);
_bStrApp.string(0, "Devices");
_bStrKey.string(0, _printerName);
_bStrDef.string(0, "");
_getProfileString.call( _bStrApp,
_bStrKey,
_bStrDef,
_bStrRet,
255);
return strReplace(_bStrRet.string(0), "winspool,", '');
}
Тогда список принтеров (с портами) можно вывести так:
X++:
static void listPrinters(Args _args)
{
container con;
int i;
;
con = WinAPI::EnumPrinters();
for (i = 1; i <= conlen(con); i++)
info(strfmt("%1 (%2)", conpeek(con, i), winAPI::GetPrinterPort(conpeek(con, i))));
}