Пользовательский драйвер для термопринтера в Windows

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

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

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

3.Возможно ли интегрировать любой файл gpd с драйвером универсального режима

а также

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

любой имеет представление об этом.


person Mr.Cool    schedule 11.11.2013    source источник


Ответы (2)


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

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

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

Звонок:

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

И вспомогательный класс:

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;
        }
    }
}
person nabuchodonossor    schedule 11.11.2013
comment
на самом деле это будет похоже на отправку данных на уже установленный принтер. На самом деле мне нужно, чтобы после того, как вы дали печать, GDI загружает ваш драйвер, и он конвертируется в PCl или какой-либо другой формат (для этой части все производители написали некоторые dll и .gpl, которые используются спулером и GDI в Windows) здесь я спрашиваю о том, как записать эти файлы - person Mr.Cool; 11.11.2013
comment
Кажется, я не совсем понял ваш вопрос. Я думал, что у вас есть принтер, установленный как GENERIC/TEXT, и вы хотите использовать язык PCL для печати на нем. Вы вынуждены писать драйвер для существующего приложения, или вы пишете приложение на C, используя этот термопринтер? - person nabuchodonossor; 11.11.2013
comment
теперь я установил свой принтер, используя режим Generic\Text only. Он работает нормально, но есть один недостаток: я не могу контролировать язык. Например, я установил язык по умолчанию для своего принтера как английский, но когда я отправляю другой язык, это означает, что мой принтер не печатает правильно, поскольку данные, поступающие на принтер, не имеют информации о языке и шрифте, у них есть только данные, поэтому в этом случае, если я пишу собственный драйвер, это означает, что я не могу настроить данные, которые я собираюсь отправить. вот почему я спрашиваю - person Mr.Cool; 11.11.2013

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

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

person nabuchodonossor    schedule 11.11.2013
comment
о, спасибо, это означает, что нет необходимости в каком-либо преобразовании pCl и post script, можете ли вы поделиться своим кодом? - person Mr.Cool; 11.11.2013
comment
Нет, вы должны отправить команды PCL на принтер, а код находится в другом ответе. У меня он есть только на C#, но вы видите вызовы API и можете использовать его и на C. - person nabuchodonossor; 11.11.2013