winapi вариант. Возвращает контейнер с адресами принтеров:
X++:
static client server container EnumPrinters()
{
container con;
#define.PRINTER_ENUM_LOCAL(0x00000002)
#define.PRINTER_ENUM_FAVORITE(0x00000004)
DLL _winApiDLL = new DLL("winspool.drv");
DLLFunction _enumPrinters = new DLLFunction(_winApiDLL, 'EnumPrintersA');
Binary bytes_needed = new Binary(4);
Binary returned = new Binary(4);
Binary printers;
Binary bStr = new Binary(255);
Binary bByte = new Binary(1);
Binary PRINTER_INFO_4;
int ret, i, offs;
;
_enumPrinters.returns(ExtTypes::DWord);
_enumPrinters.arg( ExtTypes::DWord,
ExtTypes::Pointer,
ExtTypes::DWord,
ExtTypes::Pointer,
ExtTypes::DWord,
ExtTypes::Pointer,
ExtTypes::Pointer
);
bStr.string(0, "");
bByte.byte(0, 0);
ret = _enumPrinters.call( #PRINTER_ENUM_LOCAL | #PRINTER_ENUM_FAVORITE,
bStr,
4,
bByte,
0,
bytes_needed,
returned );
printers = new Binary(bytes_needed.dWord(0));
ret = _enumPrinters.call( #PRINTER_ENUM_LOCAL | #PRINTER_ENUM_FAVORITE,
bStr,
4,
printers,
bytes_needed.dWord(0),
bytes_needed,
returned );
for (i = 0; i < returned.dWord(0); i++)
{
bStr.attach(printers.dWord(offs), 255);
con += bStr.string(0);
offs += 12;
}
return con;
}