Copy Con Lpt1

  • Автор темы Criolit
  • Дата начала
Статус
Закрыто для дальнейших ответов.
C

Criolit

Привет всем!

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


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

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

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

mr_ST

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

Код:
[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);

Собственно код:

Код:
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();
}
 
C

Criolit

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

mr_ST

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

Criolit

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

mr_ST

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

Criolit

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

mr_ST

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!