![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
usb - порт и принтер
dzuev © (2007-03-09 14:47:00)Добрый день!!!
Может кто подскажет - как послать команды принтеру через usb-порт? или может можно использовать стандартный usbprint для посылки команд? но как?
если есть пример модуля то вообще будет замечательно!!
ps: нужно именно посылать команды а не стандартный TPrinter
dzuev (2007-03-16 14:50:00) [1]Вроде получилось.
Использовать SetupApi не стал, удалось пробросить нужные данные через OpenPrinter
Спасибо тем, кто отвечал по существу
DC-AC (2007-03-15 07:35:00) [2]16: Если с принтером идет драйвер - установи его, просмотри реестр, если найдешь GUID - попробуй что-нибудь вроде этого:
implementation
uses SetupApi;
const GUID_CLASS_ID: TGUID = '{твой GUID}';
{$R *.DFM}
function TForm1.OpenDevice(MyInterfaceGuid: PGUID; DeviceNum: Integer): THandle;
var Hdi: HDEVINFO;
iHdi: Integer;
Idd: SP_DEVICE_INTERFACE_DATA;
pIddDetail: PSPDeviceInterfaceDetailData;
DesiredLength: Integer;
retval: THandle;
begin
Hdi:=SetupDiGetClassDevs(MyInterfaceGuid,
nil,
0,
DIGCF_PRESENT or DIGCF_INTERFACEDEVICE);
iHdi:=Cardinal(Hdi);
if iHdi=INVALID_HANDLE_VALUE then
begin
MessageBox(Application.Handle,'SetupDiGetClassDevs error',PChar(Application.Title),MB_ICONSTOP);
Result:=INVALID_HANDLE_VALUE;
Exit;
end;
Idd.cbSize:=sizeof(SP_DEVICE_INTERFACE_DATA);
if SetupDiEnumDeviceInterfaces(Hdi,
nil,
MyInterfaceGuid^,
DeviceNum,
Idd) = false then
begin
MessageBox(Application.Handle,'SetupDiEnumDeviceInterfaces error',PChar(Application.Title),MB_ICONSTOP);
Result:=INVALID_HANDLE_VALUE;
Exit;
end;
SetupDiGetInterfaceDeviceDetail(Hdi,
@Idd,
nil,
0,
@DesiredLength,
nil);
pIddDetail:=AllocMem(DesiredLength);
pIddDetail.cbSize:=sizeof(TSPDeviceInterfaceDetailData);
if SetupDiGetInterfaceDeviceDetail(Hdi,
@Idd,
pIddDetail,
DesiredLength,
@DesiredLength,
nil) = false then
begin
FreeMem(pIddDetail);
MessageBox(Application.Handle,'SetupDiGetInterfaceDeviceDetail error',PChar(Application.Title),MB_ICONSTOP);
Result:=INVALID_HANDLE_VALUE;
Exit;
end;
SetupDiDestroyDeviceInfoList(Hdi);
retval:=CreateFile(pIddDetail.DevicePath,
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
0,
0);
FreeMem(pIddDetail);
Result:=retval;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDevice(@GUID_CLASS_ID, 0) <> INVALID_HANDLE_VALUE
then Label1.Caption := 'OK' else Label1.Caption := 'ERROR';;
end;
SlymRO (2007-03-15 07:12:00) [3]dzuev (14.03.07 17:53) [16]
предложенный вариант печатает через драйвер принтера
Ты пробовал? PCL таким макаром работает, ни каких esc на бумагу не шлет, все переваривает как команды... можно поиграться pDatatype
dzuev (2007-03-14 17:53:00) [4]Принтер DATAMAX m4206.
его команды описаны я их знаю,
2SlymRo предложенный вариант печатает через драйвер принтера, мне же надо посылать только в порт нужные мне вещи. т.е. как лпт или cом-порт - открыл, записал, убил хэндл.
2Чапаев открытие usb001 возвращает INVALID_HANDLE_VALUE, уже давно пробовал. и вся фишка с usb и заключается в том что его так просто не откроешь.
DC-AC (2007-03-14 08:52:00) [5]Может у нас немного разные понятия слова "данные"...
Теоретически, все что улетает в принтер, можно назвать данными. Но для принтера, в котором есть свой проц с микропрограммой, все-таки данные - это текстовая или графическая информация для формирования изображения, а команды - это команды управления и контроля, будь то PCL,PJL,EJL или пакетные протоколы (стандарт 1284.4).
SlymRO (2007-03-13 13:38:00) [6]DC-AC (13.03.07 12:24) [13]
Если принтер PCL понимает то [12] вполне работает на отправку PCL команд...
DC-AC (2007-03-13 12:24:00) [7]>послать команды принтеру
Данные послать легко - см [12]. А вот чтобы послать КОМАНДЫ - нужно знать систему команд данного принтера. Какой принтер-то ???
SlymRO (2007-03-13 10:25:00) [8]Так не пробовал?:
if not OpenPrinter(PChar(PrinterName),hPrinter, nil) then RaiseLastOSError;
try
DocInfo.pDocName:='DirectPrint';
DocInfo.pOutputFile:=nil;
//DocInfo.pDatatype:='RAW';
DocInfo.pDatatype:='TEXT';
if StartDocPrinter(hPrinter,1,@DocInfo)=0 then RaiseLastOSError;
if not WritePrinter(hPrinter,PChar(s),Len,writed) then RaiseLastOSError;
if writed<>Len then RaiseLastOSError;
if not EndDocPrinter(hPrinter) then RaiseLastOSError;
finally
ClosePrinter(hPrinter);
end;
Чапаев (2007-03-12 22:50:00) [9]> [10] dzuev (12.03.07 18:52)
Ну посмотри, на каком порту принтер висит, его и открывай... Обычно это нечто вроде USB0001. Искать в свойствах принтера.
dzuev (2007-03-12 18:52:00) [10]
>
> Пиши в порт притера, Билл Гейтс за тебя проблему решил.
>
хм собсно об этом и вопрос - как это сделать, точнее чего написать в createfile если принтер usb
dzuev (2007-03-12 18:46:00) [11]
> Попробуй использовать PCL:
> http://www.biotok.ru/omega/PCLPrint.pas
>
че-то 403 форбидден говорит.(((
tesseract (2007-03-10 20:12:00) [12]
> для com порта написаны. Usb увы немного сложнее.
у него ДВЕ книги. И создание дров под USB неплохо описано.
> Т.е. надо как я понял либо драйвер который бы эмулировал
> какой-нить lpt7 и в него я бы с помощью createfile писал
> все че мне надо либо как-то открыть usb для записи. (для
> lpt уже написано все).
Пиши в порт притера, Билл Гейтс за тебя проблему решил.
crytogen (2007-03-10 09:00:00) [13]Попробуй использовать PCL:
http://www.biotok.ru/omega/PCLPrint.pas
dzuev (2007-03-09 17:54:00) [14]2Сергей М. ну это я не так выразился.
штатная не катит - не так работает как хотелось бы.
2Kolan - а есть еще и Солдатов, тоже хорошая книга. Только вот у Агурова все примеры а-ля Createfile(...) для com порта написаны. Usb увы немного сложнее.
Т.е. надо как я понял либо драйвер который бы эмулировал какой-нить lpt7 и в него я бы с помощью createfile писал все че мне надо либо как-то открыть usb для записи. (для lpt уже написано все).
Неужели надо полностью писать драйвер, с нуля и явно не на делфи(((???
Kolan (2007-03-09 16:32:00) [15]> команды принтера известны, описаны в мануле по крайней мере
Ну попробуй через этот usbprint.sys..
ЗЫ
Зв незнаешь вот у меня на столе тоже стоит хрень подключется к USB как посать команду ей?
ЗЫЫ
"Интерфейс USB. Практика использования и программирования." - хорошая книга...
Сергей М. (2007-03-09 16:30:00) [16]
> dzuev (09.03.07 16:23) [3]
>
> usbprint.sys - виртуальный лпт порт
Что за бред ?
usbprint.sys - это драйвер режима ядра.
А уж что он там творит в ходе своей работы в плане симв.ссылок - это др.вопрос.
Тебе чемне нравится штатнаяинсталляция и штатноеиспользование принтера ?
dzuev (2007-03-09 16:23:00) [17]usbprint.sys - виртуальный лпт порт, ну наподобие того, что создается в системе когда ставиться usb принтер. он вроде как стандартный и с виндой идет
команды принтера известны, описаны в мануле по крайней мере, на сайте производителя есть только дрова, которые кривые
Сергей М. (2007-03-09 15:07:00) [18]
> стандартныйusbprint
А эт чего такое ?
Kolan (2007-03-09 14:56:00) [19]> команды принтеру
SDK на сайте производителя?