Zebra P520i USB

Иванчин Вячеслав
Дата: 03.06.2011 13:50:03
как можно узнать на каком порте USB висит принтер ZEBRA
и подача туда команды вставка карточки на печать!!
на LPT более менее понятно
можно сделать не что подобное
prn := CreateFile('LPT1:', GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Command := #$1B'MS'#$0D#0;

  if (not WriteFile(prn, Command[1], length(command), rLen, nil)) then
    RsSC := 1; //WRITE_ERROR
  CloseHandle(prn);
а как быть со случаем USB?

З.Ы. сейчас не на всех материнсках платах есть LPT порты, связи с чем и возник вопрос!
Кроик Семён
Дата: 03.06.2011 13:58:37
прилагаю свою программу,
обрати внимание на строчку

edPrinterPort.Text:=StrPas(PrinterInfo.pPortName);
Кроик Семён
Дата: 03.06.2011 14:01:39
P.S.

раньше были проблемы со скачиванием приложенных файлов с пробелами в имени.

еще раз, но уже без пробела:
Иванчин Вячеслав
Дата: 03.06.2011 14:10:40
Кроик Семён,
ваша программа показывает порт USB001

и если пробую подать комаду на вставку карточки , ничего не происходит.
пробую так
prn := CreateFile('USB001:', GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Command := #$1B'MS'#$0D#0;

  if (not WriteFile(prn, Command[1], length(command), rLen, nil)) then
    RsSC := 1; //WRITE_ERROR
  CloseHandle(prn);
может есть ещё какой то другой способ заставить принтер "засасывать" карточку
defecator
Дата: 03.06.2011 14:10:47
Иванчин Вячеслав
сейчас не на всех материнсках платах есть LPT порты, связи с чем и возник вопрос!


Покупается переходник LPT-USB (~300р), в винде видится как обычный LPT-порт.
Для работы принтера его достаточно.
Для других целей переходник негоден
Michael Longneck
Дата: 03.06.2011 14:16:17
Я совсем иначе искал USB принтеры.

//  TStringDictionary = class(TDictionary<String, String>);

unit Utils.USB;
interface
uses SysUtils, Windows, Classes, Cfg, CfgMgr32, SetupApi, Dialogs, Utils.Common;
const
  GUID_DEVINTERFACE_USBPRINT:TGuid = '{28d78fad-5a12-11d1-ae5b-0000f803a8c2}';
  SPDRP_ADDRESS = $0000001C;



procedure GetUSBPrinterList(DeviceList:TStringDictionary);


implementation

procedure GetUSBPrinterList(DeviceList:TStringDictionary);
var
  devH :HDEVINFO;
  devCount :DWORD;
  interfaceGuid:TGuid;
  devInfo:SP_DEVINFO_DATA;
  devInterface: SP_DEVICE_INTERFACE_DATA;
  interfaceDetail:PSPDEVICEINTERFACEDETAILDATA;
  DevInst:Cardinal;
  Device:String;
  Description:String;
  cbSize:DWORD;
  Stub:Cardinal;
  pDevice:PChar;
  pDeviceName:PChar;
  dataType:Cardinal;
begin
  LoadSetupApi;
  LoadConfigManagerApi;

  Stub := 0;

  interfaceGuid := GUID_DEVINTERFACE_USBPRINT;

  devH := SetupDiGetClassDevs(@interfaceGuid, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
  if THandle(devH) = INVALID_HANDLE_VALUE then RaiseLastOSError;
  try
    devCount := 0;
    devInterface.cbSize := SizeOf( SP_DEVICE_INTERFACE_DATA );
    DeviceList.Clear;
    while SetupDiEnumDeviceInterfaces(devH, nil, interfaceGuid, devCount, devInterface) do
    begin
      Inc(devCount);
      cbSize := 0;

      if not SetupDiGetDeviceInterfaceDetail(devH, @devInterface, nil, 0, cbSize, nil) and
         ( GetLastError <> ERROR_INSUFFICIENT_BUFFER ) then RaiseLastOSError;
      devinfo.cbSize := SizeOf(SP_DEVINFO_DATA);

      GetMem(interfaceDetail, cbSize * 1 );
      interfaceDetail.cbSize := SizeOf(TSPDeviceInterfaceDetailData);
      try
        if not SetupDiGetDeviceInterfaceDetail(devH, @devInterface, interfaceDetail, cbSize , Stub, @devInfo)
           and ( GetLastError <> ERROR_INSUFFICIENT_BUFFER )  then   RaiseLastOSError;
        //узнали имя устройства
        pDevice := @interfaceDetail.DevicePath;
        Device := pDevice;

        //найдём собсно принтер - дочернее устройство

        DevInst := devinfo.DevInst;
        pDeviceName := nil;
        if CM_Get_Child(DevInst, DevInst, 0 ) = CR_SUCCESS then
        begin
          try
            CM_Get_DevNode_Registry_Property(DevInst, CM_DRP_DEVICEDESC, nil, nil, cbSize, 0 );
            GetMem(pDeviceName, cbSize);
            if CM_Get_DevNode_Registry_Property(DevInst, CM_DRP_DEVICEDESC, @dataType, pDeviceName, cbSize, 0 ) = CR_SUCCESS then
               Description := pDeviceName;
          finally
            FreeMem(pDeviceName);
          end;
        end;

        DeviceList.Add(Device, Description);
      finally
        FreeMem(interfaceDetail);
      end;
    end;
  finally
    SetupDiDestroyDeviceInfoList(devH);
  end;
end;

end.
Michael Longneck
Дата: 03.06.2011 14:18:15
В выходном словаре ключ - имя порта, который можно подать в CreateFile а в значении - user-friendly имя принтера. Работало с Godex на ура.
Иванчин Вячеслав
Дата: 03.06.2011 14:20:11
Michael Longneck,

если я правильно понял то вы эти модули Cfg, CfgMgr32, SetupApi с JEDI компонентах?
Michael Longneck
Дата: 03.06.2011 14:21:25
Ну да. Заголовочные файлы из SDK переводить самому - тяжёлое занятие. А тут готовое.
Кроик Семён
Дата: 03.06.2011 14:23:50
я еще один метод нашел: Enumerate Printer Port Driver Then CREATEFILE

   function EnumPorts