Используй OpenPrinter для получения дескриптора принтера типа LPHANDLE (HANDLE*). Далее юзай GetPrinter с параметром Level = 2 для получения структуры PRINTER_INFO_2, например
DWORD needed(0);
DWORD sz = sizeof(PRINTER_INFO_2);
BYTE* pBuf = new BYTE[sz];
bool bres = GetPrinter(pHandle, 2, pBuf, sz, &needed);
if (!bres && sz needed) bres = GetPrinter(pHandle, 2, pBuf, (sz=needed), &needed);
if(bres) {
PRINTER_INFO_2* pPrinterInfo = reinterpret_castPRINTER_INFO_2*> (pBuf);
// ... см. DEVMODE в PRINTER_INFO_2
}
delete[] pBuf;
Проверить, какие возможности поддерживает принтер, можно при помощи функции DeviceCapabilities. Например, поддерживает ли дуплекс:
DWORD size = DeviceCapabilities("MyPrinterName", "LPT1", DC_DUPLEX, NULL, pPrinterInfo->pDevMode);
char* buf = new char[size];
DWORD is_duplex = DeviceCapabilities("MyPrinterName", "LPT1", DC_DUPLEX, buf, pPrinterInfo->pDevMode); // pPrinterInfo->pDevMode из предыд. кода
if(is_duplex==1) ShowMessage("Принтер поддерживает дуплекс!");
else ShowMessage("Принтер не поддерживает дуплекс!");
delete[] buf;