Hola.
Yo mando la cadena a la impresora por su nombre en vez de abrir directamente el puerto y uso este código que te sirve tanto para impresoras locales como para impresoras en red:
Código Delphi
[-]
procedure AbreElCajon(var Impreso: TImpreso);
function CreaLinea: String;
var
sAux: String;
begin
Result := '';
sAux := Trim(DlgPropiedades.ComandoAperturaCajon);
while Pos(' ', sAux) > 0 do begin
try
Result := Result + Chr(StrToInt(Copy(sAux, 1, Pos(' ', sAux)-1)));
except
end;
sAux := TrimLeft(Copy(sAux, Pos(' ', sAux)+1, Length(sAux)));
end;
try
Result := Result + Chr(StrToInt(sAux));
except
end;
end;
procedure AbreCajonSerie(sPuerto: String);
var
Puerto: THandle;
Cadena: String;
BytesEscritos: DWord;
begin
Cadena := #27 + #8;
Puerto := CreateFile(PChar(sPuerto),
GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
WriteFile(Puerto,
PChar(Cadena)^,
Length(Cadena),
BytesEscritos,
nil);
CloseHandle(Puerto);
end;
var
DocInfo1: TDocInfo1;
Handle: THandle;
Linea: String;
N: DWORD;
begin
if DlgPropiedades.ImpresoraCajon < 0 then begin
if DlgPropiedades.ImpresoraCajon = -1 then
AbreCajonSerie('COM1')
else if DlgPropiedades.ImpresoraCajon = -2 then
AbreCajonSerie('COM2');
Exit;
end;
if Printer.Printers.Count = 0 then Exit;
if Pos(' on', Printer.Printers[Impreso.Impresora]) > 0 then begin
if not OpenPrinter(PChar(Copy(Printer.Printers[Impreso.Impresora], 1, Pos(' on', Printer.Printers[Impreso.Impresora])-1)), Handle, nil) then begin
ShowMessage('Error en OpenPrinter : ' + Printer.Printers[Impreso.Impresora]);
Exit;
end;
end else begin
if not OpenPrinter(PChar(Printer.Printers[Impreso.Impresora]), Handle, nil) then begin
ShowMessage('Error en OpenPrinter : ' + Printer.Printers[Impreso.Impresora]);
Exit;
end;
end;
with DocInfo1 do begin
pDocName := PChar(Impreso.Nombre);
pOutputFile := nil;
pDataType := 'RAW';
end;
StartDocPrinter(Handle, 1, @DocInfo1);
StartPagePrinter(Handle);
Linea := CreaLinea;
WritePrinter(Handle, PChar(Linea), Length(Linea), N);
EndPagePrinter(Handle);
EndDocPrinter(Handle);
ClosePrinter(Handle);
end;