Copy Con Lpt1

Тема в разделе ".NET", создана пользователем Criolit, 10 апр 2007.

Статус темы:
Закрыта.
  1. Criolit

    Criolit Гость

    Привет всем!

    Я делаю сейчас приложение для магазина. Одна из возможностей приложения - это печать наклеек со штрих кодом. Есть специальный для этого принтер. Для вывода на печать используется язык TPL. Для ввода программы принтеру нужно:
    Код (Text):
    С:\>COPY CON LPT1
    SIZE 100 mm, 50 mm
    DIRECTION 1, 0
    PRINT 1
    <Ctrl+Z>

    и программа выполняется.

    Вопрос такой. Как в программе на C# выполнить такое? Как направить принтеру эти команды?
    Заранее спасибо.

    P.S. Использую Framework 2.0
     
  2. mr_ST

    mr_ST Гость

    Т.к. устройтсва открывать нельзя приходится использовать апишную функцию CreateFile

    Код (Text):
    [Flags]
    public enum EFileAttributes : uint
    {
    Readonly = 0x00000001,
    Hidden = 0x00000002,
    System = 0x00000004,
    Directory = 0x00000010,
    Archive = 0x00000020,
    Device = 0x00000040,
    Normal = 0x00000080,
    Temporary = 0x00000100,
    SparseFile = 0x00000200,
    ReparsePoint = 0x00000400,
    Compressed = 0x00000800,
    Offline = 0x00001000,
    NotContentIndexed = 0x00002000,
    Encrypted = 0x00004000,
    Write_Through = 0x80000000,
    Overlapped = 0x40000000,
    NoBuffering = 0x20000000,
    RandomAccess = 0x10000000,
    SequentialScan = 0x08000000,
    DeleteOnClose = 0x04000000,
    BackupSemantics = 0x02000000,
    PosixSemantics = 0x01000000,
    OpenReparsePoint = 0x00200000,
    OpenNoRecall = 0x00100000,
    FirstPipeInstance = 0x00080000
    }

    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern SafeFileHandle CreateFile(
    string fileName,
    [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
    [MarshalAs(UnmanagedType.U4)] FileShare fileShare,
    IntPtr securityAttributes,
    [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
    [MarshalAs(UnmanagedType.U4)] EFileAttributes flags,
    IntPtr template);
    Собственно код:

    Код (Text):
    SafeFileHandle handle = CreateFile("LPT1", FileAccess.Write, 0, IntPtr.Zero,FileMode.Open, 0, IntPtr.Zero);
    if (handle.IsInvalid)
    Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());

    using (FileStream fs = new FileStream(handle, FileAccess.Write))
    using (StreamWriter sw = new StreamWriter(fs, Encoding.ASCII))
    {
    sw.WriteLine("SIZE 100 mm, 50 mm");
    sw.WriteLine("DIRECTION 1, 0");
    sw.WriteLine("PRINT 1");
    sw.Flush();
    }
     
  3. Criolit

    Criolit Гость

    Большое спасибо mr_ST, сегодня попробую сделать. Просто это делаю дома, левый заказ :)
     
  4. mr_ST

    mr_ST Гость

    Не за что, обращайся. Опыт борьбы с лпт у меня большой :)
     
  5. Criolit

    Criolit Гость

    Работает отлично! :) Еще раз спасибо!
     
  6. mr_ST

    mr_ST Гость

    С выключенным принтером поробуй, как бы оно в вечное ожидание записи не ушло...
     
  7. Criolit

    Criolit Гость

    А если таки приложение "уйдет в горы"? Есть ли возможность определения того, что принтер отключен?
     
  8. mr_ST

    mr_ST Гость

    Два способа:
    1. Легальный: через WMI узнать статус принтера
    2. Не совсем легальный: используя SetCommTimeouts (на самом деле работает не только для COM портов) выставит таймаут для записи. В нашем случае наиболее разумный способ, коль уж мы и так используем WinAPI.
     
  9. Criolit

    Criolit Гость

    Спасибо. Да, без API никуда. :)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей