es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué DeviceCapabilities() podría devolver 4294967295 para DC_BINS?

Estoy extrayendo la bandeja de impresora seleccionada de una llamada WIN32 a PrintDlgEx(). Esto parece funcionar correctamente la mayoría de las veces, pero recientemente agregué una nueva impresora a mi máquina (una DYMO LabelWriter 450) y causó que mi software simple fallara.

Al investigarlo, la llamada a DeviceCapabilities() para DC_BINS está devolviendo 4294967295, mientras que todas las otras impresoras que he probado hasta ahora regresan recuentos de bandejas de un solo dígito.

Mi primera inclinación es omitir el nombre de la bandeja cuando el recuento de la misma es mayor que un umbral determinado (digamos… ¿20?), pero no me encanta esta solución.

¿Existe alguna razón conocida por la cual una impresora devolvería el valor máximo de INT SIN SIGNO para esto? ¿Son solo controladores mal escritos, o hay un significado alternativo? O tal vez simplemente no comprendo el valor previsto.

Si tengo que escribir una limitación arbitraria, lo haré, pero me gustaría entender mejor por qué existe esta situación. Claramente, esta impresora no tiene miles de bandejas de impresora diferentes.

Aquí hay un MRE:

“`c++
HINSTANCE hinst = GetModuleHandle(NULL);
HRESULT hResult;
PRINTDLGEX pdx = {0};
LPPRINTPAGERANGE pPageRanges = NULL;
HWND hWndOwner = GetForegroundWindow();

if(!hWndOwner){
hWndOwner = GetDesktopWindow();
}

// Asigna un array de estructuras PRINTPAGERANGE.
pPageRanges = (LPPRINTPAGERANGE) GlobalAlloc(GPTR, 10 * sizeof(PRINTPAGERANGE));
if(!pPageRanges){
return wprintf(L"{\"error\": \"%s\"}", GetLastError()); // "Su computadora no tiene suficiente memoria para completar esta operación:"
}

// Inicializa la estructura PRINTDLGEX.
pdx.lStructSize = sizeof(PRINTDLGEX);
pdx.hwndOwner = hWndOwner;
pdx.hDevMode = NULL;
pdx.hDevNames = NULL;
pdx.hDC = NULL;
pdx.Flags = PD_RETURNDC | PD_COLLATE;
pdx.Flags2 = 0;
pdx.ExclusionFlags = 0;
pdx.nPageRanges = 0;
pdx.nMaxPageRanges = 10;
pdx.lpPageRanges = pPageRanges;
pdx.nMinPage = 1;
pdx.nMaxPage = 1000;
pdx.nCopies = 1;
pdx.hInstance = 0;
pdx.lpPrintTemplateName = NULL;
pdx.lpCallback = NULL;
pdx.nPropertyPages = 0;
pdx.lphPropertyPages = NULL;
pdx.nStartPage = START_PAGE_GENERAL;
pdx.dwResultAction = 0;

// Invoca la hoja de propiedades de impresión.
hResult = PrintDlgEx(&pdx);

DEVMODE * myDevMode = (DEVMODE <em>)GlobalLock(pdx.hDevMode);
DWORD binCount = DeviceCapabilities((CHAR</em>)myDevMode->dmDeviceName, nullptr, DC_BINS, nullptr, nullptr);
DWORD binNameCount = DeviceCapabilities((CHAR*)myDevMode->dmDeviceName, nullptr, DC_BINNAMES, nullptr, nullptr);
wprintf(L"\"binCount\":\"%lu\",", binCount);
wprintf(L"\"binNameCount\":\"%lu\",", binNameCount);

“`

Tags:  ,

Answer

  1. Avatar for davy.ai

    Es posible que el controlador de la impresora no informe correctamente el número de bandejas. También es posible que el controlador de la impresora no informe correctamente los nombres de las bandejas. Si tiene que escribir una letra mayúscula arbitraria, podría establecer un umbral de 20 y omitir el nombre de la bandeja cuando el recuento de la bandeja sea mayor que eso.

Comments are closed.