2013-11-11 4 views
0

Я пытаюсь разработать драйвер для моего принтера, работающего на COM-порту. это термопринтер, который больше всего ориентируется на получение печати. ​​Но у меня нет драйвера для этого принтера, поэтому теперь я использую окна «GENERIC \ TEXT ONLY PRINTER» drivers.it работает, но проблема в том, что я не могу управлять языком .i есть некоторые сомнения по поводу окна только для текста только драйверПользовательский драйвер для термопринтера в окнах

1.может ли использовать универсальный \ текстовый режим только для разных шрифтов и языка?

2.может ли он иметь собственный монитор языка и драйвер OEM?

3.Is позволяет интегрировать любой файл GPD с универсальным драйвером режима

, а также

В основном для любого принтера имеет три основных компонента в драйвере, которые язык монитора, драйвер OEM уни, Пользовательский интерфейс, этот драйвер должен быть разработан в WDK, для любого открытого источника, доступного для этого типа для разработки драйвера принтера.

любой есть идея об этом.

ответ

1

Так I'm теперь назад, и я сказал что-то неправильно - это было не VB6, это было уже C# - Вам придется перевести это (в основном вы можете использовать одни и те же вызовы API ..)

Я также нашел этот код где-то в сети ... это не ускользнуло от моего мозга

это была служба, используется для старого приложения DOS для печати на HP Laserjet (приложение Dos знает как использовать PCL).

Вызов:

RawPrinterHelper.SendFileToPrinter(new PrinterSettings().PrinterName, fileName); 

И Helper Класс:

using System; 
using System.Drawing; 
using System.Drawing.Printing; 
using System.IO; 
using System.Runtime.InteropServices; 

namespace RAW_Print 
{ 
    public class RawPrinterHelper 
    { 
     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
     public class DOCINFOA 
     { 
      [MarshalAs(UnmanagedType.LPStr)] 
      public string pDocName; 
      [MarshalAs(UnmanagedType.LPStr)] 
      public string pOutputFile; 
      [MarshalAs(UnmanagedType.LPStr)] 
      public string pDataType; 
     } 
     [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
     public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd); 

     [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
     public static extern bool ClosePrinter(IntPtr hPrinter); 

     [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
     public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di); 

     [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
     public static extern bool EndDocPrinter(IntPtr hPrinter); 

     [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
     public static extern bool StartPagePrinter(IntPtr hPrinter); 

     [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
     public static extern bool EndPagePrinter(IntPtr hPrinter); 

     [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
     public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten); 

     public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount) 
     { 
      Int32 dwError = 0, dwWritten = 0; 
      IntPtr hPrinter = new IntPtr(0); 
      DOCINFOA di = new DOCINFOA(); 
      bool bSuccess = false; 

      di.pDocName = "your doc name"; 
      di.pDataType = "RAW"; 

      if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) 
      { 
       if (StartDocPrinter(hPrinter, 1, di)) 
       { 
        if (StartPagePrinter(hPrinter)) 
        { 
         bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten); 
         EndPagePrinter(hPrinter); 
        } 
        EndDocPrinter(hPrinter); 
       } 
       ClosePrinter(hPrinter); 
      } 
      if (bSuccess == false) 
      { 
       dwError = Marshal.GetLastWin32Error(); 
      } 
      return bSuccess; 
     } 

     public static bool SendFileToPrinter(string szPrinterName, string szFileName) 
     { 
      FileStream fs = new FileStream(szFileName, FileMode.Open); 
      BinaryReader br = new BinaryReader(fs); 
      Byte []bytes = new Byte[fs.Length]; 
      bool bSuccess = false; 
      IntPtr pUnmanagedBytes = new IntPtr(0); 
      int nLength; 

      nLength = Convert.ToInt32(fs.Length); 

      bytes = br.ReadBytes(nLength); 
      pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength); 
      Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength); 
      bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength); 
      Marshal.FreeCoTaskMem(pUnmanagedBytes); 
      br.Close(); 
      fs.Close(); 
      return bSuccess; 
     } 
     public static bool SendStringToPrinter(string szPrinterName, string szString) 
     { 
      IntPtr pBytes; 
      Int32 dwCount; 
      dwCount = szString.Length; 
      pBytes = Marshal.StringToCoTaskMemAnsi(szString); 
      SendBytesToPrinter(szPrinterName, pBytes, dwCount); 
      Marshal.FreeCoTaskMem(pBytes); 
      return true; 
     } 
    } 
} 
+0

на самом деле это будет похоже на отправку данных на уже установленный принтер. Фактически, мне нужно, чтобы после того, как вы предоставили средства печати, GDI загружает ваш драйвер и скрывает его в PCl или какой-либо другой формат (для этой части все производство написало несколько dll и .gpl, которое используемый буферизацией и GDI в окнах), здесь я спрашиваю о том, как писать эти файлы. –

+0

Кажется, я точно не понял ваш вопрос. Я думал, что у вас есть принтер, установленный как GENERIC/TEXT, и вы хотите использовать язык PCL для печати на нем. Вы вынуждены писать драйвер для существующего приложения или записываете приложение на C с помощью этого термопринтера? – nabuchodonossor

+0

теперь я установил свой принтер, используя режим Generic \ Text only.что работаю нормально, но один недостаток - я не могу контролировать язык. Например, я устанавливаю свой язык по умолчанию для принтера как английский, но когда я отправляю другой язык, значит, мой принтер не печатает правильно, потому что данные, поступающие на принтер, не имеют языка и информация о шрифте у него есть только данные, поэтому для этого случая, если я пишу собственный драйвер, я не могу настроить данные, что я собираюсь отправить. Вот почему я спрашиваю –

0

В мои древние времена программирования с помощью VB6 можно было открыть принтер как «RAW-принтер», то есть на самом деле это технология без драйверов - у вас есть полная работа.

Я начну поиск в своих старых источниках для этого, я уверен, вы можете перевести это на c-язык, если вам это нужно.

+0

ой спасибо, что означает, что нет никакой необходимости в каких-либо прав преобразования сценария PCl и пост, вы можете поделиться кодом YR? –

+0

Нет, вам нужно отправить команды PCL на принтер, а код - в другом ответе. Я использую его только в C#, но вы видите вызовы api и можете использовать его и в C. – nabuchodonossor