Primeramente, mi problema es que quiero cambiar el tamaño del papel de la impresora.
Hace tiempo que plantee este problema en otro hilo, y ahora después de seguir investigando encontré este link, directo del soporte técnico de Microsoft
http://support.microsoft.com/default...0285#appliesto
Aqui explican cómo usando la API es posible cambiar las propiedades de la impresión, pero... lo estuve trasladando a Pascal y tengo un problema:
Código:
var
hPrinter: THandle;
dwNeeded: Dword;
pi2: ^PRINTER_INFO_2;
pDevMode: ^DevMode;
pd: PRINTER_DEFAULTS;
begin
hprinter := 0;
dwNeeded := 0;
pdevmode := nil;
ZeroMemory( @pd, Sizeof(pd) );
pd.DesiredAccess := PRINTER_ACCESS_ADMINISTER;
if OpenPrinter(PAnsiChar(Printer.Printers[Printer.PrinterIndex]), hPrinter, @pd ) then
begin
SetLastError(0);
GetPrinter(hPrinter, 2, nil, 0, @dwNeeded );
pi2 := Pointer( GlobalAlloc( GPTR, dwNeeded ) );
if not( GetPrinter(hPrinter, 2, pi2, dwNeeded, @dwNeeded) ) then
begin
ShowMessage( IntToStr(GetLastError) );
Exit;
end;
if pi2.pDevMode <> nil then
begin
pi2.pSecurityDescriptor := nil;
pi2.pDevMode.dmFields := DM_PAPERLENGTH and DM_PAPERWIDTH and DM_PAPERSIZE;
pi2.pDevMode.dmPaperLength := 1000;
pi2.pDevMode.dmPaperWidth := 2160;
pi2.pDevMode.dmPaperSize := DMPAPER_User;
end;
end;
end;
Se darán cuenta que no lo trasladé textualmente, y me salté algunas validaciones, porque las estoy haciendo con 'Watches' y ejecutando 'Paso a paso', pero en la línea marcada con negrita siempre me da
FALSE y no logro entender porqué, a ver si pueden revisar el código original (escrito en c++) y me pueden echar una mano para corregir algo en lo que me haya equivocado o decirme "de plano nunca vas a poder cambiar el tamaño de papel"
PD: Nótese que según el soporte técnico de Microsoft, este código sirve para XP y NT, yo estoy usando XP Professional