-
Добрый день! Замучился уже. Задача - послать текстовый файл на матричный принтер (локальный или сетевой). С локальным просто команда (copy file.txt prn), а как узнать сетевое имя для сетевого принтера. Использую printdialog и модуль printers.
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, Menus, Buttons, RpSystem, RpDefine, RpRave, RpFiler, RpBase,printers;
begin if form3.PrintDialog1.Execute then name_prn:=Printers.Printer.Printers.Strings[printer.PrinterIndex];
Проблема в том, что выводится имя "\\server\Epson LX-300+", а его сетевое имя "\\server\EpsonLX-" , выходит обрезано до 8 символов и удалены пробелы. Но пользователь может его поменять в свойствах принтера и ... нет печати. Как найти сетевое имя принтера программно???
Очень прошу помощи!!!
-
> Проблема в том, что выводится имя "\\server\Epson LX-300+"
очень глупо. еще бы русскими буквами назвали бы.
-
Система при установке принтера так его называет по умолчанию...
-
1. Прочесть текстовый файл. 2. Отправить его на принтер.
-
Обычно очередь назначается порту, я точно не помню, давно не работал, но примерно так set printer to \\queue=LPT1
-
> alex2000 (16.03.11 20:36) [2]
так измени умолчание. из-за таких имен вылазет всякое, фиг найдешь. к примеру, имя компьютера, содержащее русские буквы, пробелы, скобки - вполне допустимо. Для семерки, по крайней мере. И все работает... кроме некоторых случаев с SMTP. И хрен догадаешься, что 5**-ая ошибка смтп связано с именем компа.
> Anatoly Podgoretsky © (16.03.11 20:58) [4]
в вин7 не прокатит, это ж вроде 16-битных остатки?
-
На одной машине изменить можно, а у клиента может быть до десятка принтеров и клиент не один... Хотелось, что бы работало в общем случае...
-
Вопрос вообщето про ХР, но и на семерке должно работать, они же не отменяли LanMan и переменные среды, а не 16 бит приложение. Но я уже все забыл по этому поводу, последний раз с этим работал в FoxPro 10 лет назад. А "\\server\EpsonLX-" не сетевое имя, а имя очереди на сервере и обычно его можно там же и поменять
-
посмотрел у себя... и не нашел ни одного без пробелов в названии... \\fs\HP LaserJet 2430 PCL 6 вполне нормально печатает, ничего не обрезает (про клиентов вообще не говорю, их полно кто то да "намудрит", наверняка у них есть и русскими, и т.д. и никто не жаловался) хотя матричного наверняка уже ни кого нет...
-
> выводится имя "\\server\Epson LX-300+", а его сетевое имя "\\server\EpsonLX-"
- актуальные Device, Driver, Port и DeviceMode - спрятаны в классах Printers - и они редко совпадают с Display Name... Но если очень надо, примерно так: var
Device, Driver, Port: array[0..1023] of char; hDeviceMode: THandle;
pDMode: PDeviceMode;
begin
try
Printer.PrinterIndex; hDeviceMode:= 0; DC:= 0;
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
if( hDeviceMode <> 0 )then begin
pDMode:= GlobalLock(hDeviceMode);
if( pDMode <> nil )then begin
...
GlobalUnlock(hDeviceMode);
end;
end;
except
end; - реализация Printer.GetPrinter - крайне неудачная(вход/выход - PChar, размер буферов никак не проверяется, минимальный/максимальный размер не оговаривается), но в Dialogs используется именно так, а раскручивать дальше - либо в генокод лезть, либо всю принтерную шелуху самому писать...
-
> sniknik (17.03.2011 09:47:08) [8]
Смотреть надо ДОС (NETBIOS) имя, а у тебя наверно такого нет
-
> han_malign (17.03.2011 10:24:09) [9]
Длину надо устанавливать в MAX_PATH
-
> Смотреть надо ДОС (NETBIOS) имя ну если дос (короткое имя), то его можно узнать - GetShortPathName (хотя, не уверен насчет сетевого пути... и вообще что то тут странное, больше вероятность ошибки в 17й строке, чем реальная проблема).
-
Пробовал я и так Printer.GetPrinter(Device, Driver, Port, hDeviceMode); Все равно возвращает имя принтера "\\server\Epson LX-300+" Вот, Anatoly Podgoretsky наверное правильно сказал, что нужно искать NETBIOS имя. А как? Если зайти в папку принтеры и вызвать его свойства - обнаружим "Общие" - имя принтера Epson LX-300+, "Доступ" - сетевок имя EpsonLX- и его (к сожалению можно изменить). То есть если пользователь его поменяет - все, печати нет. А вот Far Manager корректно печатает - какое бы имя я не поставил. Значит есть возможность вытащить его программно. Но как?
-
> Значит есть возможность вытащить его программно
Всё прочитал, но так и не понял, зачем он кому-то нужен.
|