Конференция "WinAPI" » Узнать имя сетевого принтера [WinXP]
 
  • alex2000 (16.03.11 19:26) [0]
    Добрый день!
    Замучился уже. Задача - послать текстовый файл на матричный принтер (локальный или сетевой). С локальным просто команда (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 символов и удалены пробелы. Но пользователь может его поменять в свойствах принтера и ... нет печати. Как найти сетевое имя принтера программно???

    Очень прошу помощи!!!
  • KilkennyCat © (16.03.11 20:25) [1]

    > Проблема в том, что выводится имя "\\server\Epson LX-300+"

    очень глупо. еще бы русскими буквами назвали бы.
  • alex2000 (16.03.11 20:36) [2]
    Система при установке принтера так его называет по умолчанию...
  • Dimka Maslov © (16.03.11 20:48) [3]
    1. Прочесть текстовый файл.
    2. Отправить его на принтер.
  • Anatoly Podgoretsky © (16.03.11 20:58) [4]
    Обычно очередь назначается порту, я точно не помню, давно не работал, но примерно так
    set printer to \\queue=LPT1
  • KilkennyCat © (17.03.11 00:26) [5]

    > alex2000   (16.03.11 20:36) [2]

    так измени умолчание.
    из-за таких имен вылазет
    всякое, фиг найдешь.
    к примеру, имя компьютера, содержащее русские буквы, пробелы, скобки - вполне допустимо. Для семерки, по крайней мере.
    И все работает... кроме некоторых случаев с SMTP. И хрен догадаешься, что 5**-ая ошибка смтп связано с именем компа.


    > Anatoly Podgoretsky ©   (16.03.11 20:58) [4]

    в вин7 не прокатит, это ж вроде 16-битных остатки?
  • alex2000 (17.03.11 09:03) [6]
    На одной машине изменить можно, а у клиента может быть до десятка принтеров и клиент не один... Хотелось, что бы работало в общем случае...
  • Anatoly Podgoretsky © (17.03.11 09:04) [7]
    Вопрос вообщето про ХР, но и на семерке должно работать, они же не отменяли LanMan и переменные среды, а не 16 бит приложение.
    Но я уже все забыл по этому поводу, последний раз с этим работал в FoxPro 10 лет назад. А "\\server\EpsonLX-"  не сетевое имя, а имя очереди на сервере и обычно его можно там же и поменять
  • sniknik © (17.03.11 09:47) [8]
    посмотрел у себя... и не нашел ни одного без пробелов в названии...
    \\fs\HP LaserJet 2430 PCL 6
    вполне нормально печатает, ничего не обрезает (про клиентов вообще не говорю, их полно кто то да "намудрит", наверняка у них есть и русскими, и т.д. и никто не жаловался)
    хотя матричного наверняка уже ни кого нет...
  • han_malign (17.03.11 10:24) [9]

    > выводится имя "\\server\Epson LX-300+", а его сетевое имя "\\server\EpsonLX-"

    - актуальные Device, Driver, Port и DeviceMode - спрятаны в классах Printers - и они редко совпадают с Display Name...
    Но если очень надо, примерно так:
    var
     //--------- unwind Printer methods ---------
     Device, Driver, Port: array[0..1023] of char;//sizes from Dialogs.GetPrinter
     hDeviceMode: THandle;
     pDMode: PDeviceMode;
    begin
     try
       Printer.PrinterIndex;  // raises an exception if there is no default printer
     //--------- unwind Printer methods ---------
       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 используется именно так, а раскручивать дальше - либо в генокод лезть, либо всю принтерную шелуху самому писать...
  • Anatoly Podgoretsky © (17.03.11 11:39) [10]
    > sniknik  (17.03.2011 09:47:08)  [8]

    Смотреть надо ДОС (NETBIOS) имя, а у тебя наверно такого нет
  • Anatoly Podgoretsky © (17.03.11 11:40) [11]
    > han_malign  (17.03.2011 10:24:09)  [9]

    Длину надо устанавливать в MAX_PATH
  • sniknik © (17.03.11 11:48) [12]
    > Смотреть надо ДОС (NETBIOS) имя
    ну если дос (короткое имя), то его можно узнать - GetShortPathName (хотя, не уверен насчет сетевого пути... и вообще что то тут странное, больше вероятность ошибки в 17й строке, чем реальная проблема).
  • alex2000 (18.03.11 12:28) [13]
    Пробовал я и так
    Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
    Все равно возвращает имя принтера "\\server\Epson LX-300+"
    Вот, Anatoly Podgoretsky наверное правильно сказал, что нужно искать NETBIOS имя. А как?
    Если зайти в папку принтеры и вызвать его свойства - обнаружим "Общие" - имя принтера Epson LX-300+, "Доступ" - сетевок имя EpsonLX- и его (к сожалению можно изменить). То есть если пользователь его поменяет - все, печати нет. А вот Far Manager корректно печатает - какое бы имя я не поставил. Значит есть возможность вытащить его программно. Но как?
  • DiamondShark © (18.03.11 13:34) [14]

    > Значит есть возможность вытащить его программно

    Всё прочитал, но так и не понял, зачем он кому-то нужен.
 
Конференция "WinAPI" » Узнать имя сетевого принтера [WinXP]
Есть новые Нет новых   [134431   +12][b:0][p:0.001]