Форум: "WinAPI";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Внизusb - порт и принтер Найти похожие ветки
← →
dzuev (2007-03-09 14:47) [0]Добрый день!!!
Может кто подскажет - как послать команды принтеру через usb-порт? или может можно использовать стандартный usbprint для посылки команд? но как?
если есть пример модуля то вообще будет замечательно!!
ps: нужно именно посылать команды а не стандартный TPrinter
← →
Kolan © (2007-03-09 14:56) [1]> команды принтеру
SDK на сайте производителя?
← →
Сергей М. © (2007-03-09 15:07) [2]
> стандартный usbprint
А эт чего такое ?
← →
dzuev (2007-03-09 16:23) [3]usbprint.sys - виртуальный лпт порт, ну наподобие того, что создается в системе когда ставиться usb принтер. он вроде как стандартный и с виндой идет
команды принтера известны, описаны в мануле по крайней мере, на сайте производителя есть только дрова, которые кривые
← →
Сергей М. © (2007-03-09 16:30) [4]
> dzuev (09.03.07 16:23) [3]
>
> usbprint.sys - виртуальный лпт порт
Что за бред ?
usbprint.sys - это драйвер режима ядра.
А уж что он там творит в ходе своей работы в плане симв.ссылок - это др.вопрос.
Тебе чем не нравится штатная инсталляция и штатное использование принтера ?
← →
Kolan © (2007-03-09 16:32) [5]> команды принтера известны, описаны в мануле по крайней мере
Ну попробуй через этот usbprint.sys..
ЗЫ
Зв незнаешь вот у меня на столе тоже стоит хрень подключется к USB как посать команду ей?
ЗЫЫ
"Интерфейс USB. Практика использования и программирования." - хорошая книга...
← →
dzuev (2007-03-09 17:54) [6]2Сергей М. ну это я не так выразился.
штатная не катит - не так работает как хотелось бы.
2Kolan - а есть еще и Солдатов, тоже хорошая книга. Только вот у Агурова все примеры а-ля Createfile(...) для com порта написаны. Usb увы немного сложнее.
Т.е. надо как я понял либо драйвер который бы эмулировал какой-нить lpt7 и в него я бы с помощью createfile писал все че мне надо либо как-то открыть usb для записи. (для lpt уже написано все).
Неужели надо полностью писать драйвер, с нуля и явно не на делфи(((???
← →
crytogen (2007-03-10 09:00) [7]Попробуй использовать PCL:
http://www.biotok.ru/omega/PCLPrint.pas
← →
tesseract © (2007-03-10 20:12) [8]
> для com порта написаны. Usb увы немного сложнее.
у него ДВЕ книги. И создание дров под USB неплохо описано.
> Т.е. надо как я понял либо драйвер который бы эмулировал
> какой-нить lpt7 и в него я бы с помощью createfile писал
> все че мне надо либо как-то открыть usb для записи. (для
> lpt уже написано все).
Пиши в порт притера, Билл Гейтс за тебя проблему решил.
← →
dzuev (2007-03-12 18:46) [9]
> Попробуй использовать PCL:
> http://www.biotok.ru/omega/PCLPrint.pas
>
че-то 403 форбидден говорит.(((
← →
dzuev (2007-03-12 18:52) [10]
>
> Пиши в порт притера, Билл Гейтс за тебя проблему решил.
>
хм собсно об этом и вопрос - как это сделать, точнее чего написать в createfile если принтер usb
← →
Чапаев © (2007-03-12 22:50) [11]> [10] dzuev (12.03.07 18:52)
Ну посмотри, на каком порту принтер висит, его и открывай... Обычно это нечто вроде USB0001. Искать в свойствах принтера.
← →
SlymRO © (2007-03-13 10:25) [12]Так не пробовал?:
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;
← →
DC-AC (2007-03-13 12:24) [13]>послать команды принтеру
Данные послать легко - см [12]. А вот чтобы послать КОМАНДЫ - нужно знать систему команд данного принтера. Какой принтер-то ???
← →
SlymRO © (2007-03-13 13:38) [14]DC-AC (13.03.07 12:24) [13]
Если принтер PCL понимает то [12] вполне работает на отправку PCL команд...
← →
DC-AC (2007-03-14 08:52) [15]Может у нас немного разные понятия слова "данные"...
Теоретически, все что улетает в принтер, можно назвать данными. Но для принтера, в котором есть свой проц с микропрограммой, все-таки данные - это текстовая или графическая информация для формирования изображения, а команды - это команды управления и контроля, будь то PCL,PJL,EJL или пакетные протоколы (стандарт 1284.4).
← →
dzuev (2007-03-14 17:53) [16]Принтер DATAMAX m4206.
его команды описаны я их знаю,
2SlymRo предложенный вариант печатает через драйвер принтера, мне же надо посылать только в порт нужные мне вещи. т.е. как лпт или cом-порт - открыл, записал, убил хэндл.
2Чапаев открытие usb001 возвращает INVALID_HANDLE_VALUE, уже давно пробовал. и вся фишка с usb и заключается в том что его так просто не откроешь.
← →
SlymRO © (2007-03-15 07:12) [17]dzuev (14.03.07 17:53) [16]
предложенный вариант печатает через драйвер принтера
Ты пробовал? PCL таким макаром работает, ни каких esc на бумагу не шлет, все переваривает как команды... можно поиграться pDatatype
← →
DC-AC (2007-03-15 07:35) [18]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;
← →
dzuev (2007-03-16 14:50) [19]Вроде получилось.
Использовать SetupApi не стал, удалось пробросить нужные данные через OpenPrinter
Спасибо тем, кто отвечал по существу
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.043 c