首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

直接输出字符串到远程打印机,出有关问题,贴代码,100分急求解

2012-01-14 
直接输出字符串到远程打印机,出问题,贴代码,100分急求解!在线等代码可以直接输出到远程打印机,但是A4纸上

直接输出字符串到远程打印机,出问题,贴代码,100分急求解!在线等
代码可以直接输出到远程打印机,但是A4纸上的却是乱码,代码如下,急求解,请高手指教!谢谢

public   partial   class   Form1   :   Form
{
        public   struct   DOCINFO
        {
              [MarshalAs(UnmanagedType.LPWStr)]public   string   pDocName;
              [MarshalAs(UnmanagedType.LPWStr)]public   string   pOutputFile;
              [MarshalAs(UnmanagedType.LPWStr)]public   string   pDataType;
        }

        public   class   PrintDirect
        {
              [DllImport( "winspool.drv ",   CharSet   =   CharSet.Unicode,   ExactSpelling   =   false,
                      CallingConvention   =   CallingConvention.StdCall)]
                        public   static   extern   long   OpenPrinter(string   pPrinterName,   ref   IntPtr   phPrinter,
                        int   pDefault);

                        [DllImport( "winspool.drv ",   CharSet   =   CharSet.Unicode,   ExactSpelling   =   false,
                      CallingConvention   =   CallingConvention.StdCall)]
                        public   static   extern   long   StartDocPrinter(IntPtr   hPrinter,   int   Level,
                        ref   DOCINFO   pDocInfo);

                        [DllImport( "winspool.drv ",   CharSet   =   CharSet.Unicode,   ExactSpelling   =   true,
                      CallingConvention   =   CallingConvention.StdCall)]
                        public   static   extern   long   StartPagePrinter(IntPtr   hPrinter);
                        [DllImport( "winspool.drv ",   CharSet   =   CharSet.Ansi,   ExactSpelling   =   true,
                      CallingConvention   =   CallingConvention.StdCall)]
                        public   static   extern   long   WritePrinter(IntPtr   hPrinter,   string   data,
                        int   buf,   ref   int   pcWritten);

                        [DllImport( "winspool.drv ",   CharSet   =   CharSet.Unicode,   ExactSpelling   =   true,
                      CallingConvention   =   CallingConvention.StdCall)]


                        public   static   extern   long   EndPagePrinter(IntPtr   hPrinter);

                        [DllImport( "winspool.drv ",   CharSet   =   CharSet.Unicode,   ExactSpelling   =   true,
                      CallingConvention   =   CallingConvention.StdCall)]
                        public   static   extern   long   EndDocPrinter(IntPtr   hPrinter);

                        [DllImport( "winspool.drv ",   CharSet   =   CharSet.Unicode,   ExactSpelling   =   true,
                      CallingConvention   =   CallingConvention.StdCall)]
                        public   static   extern   long   ClosePrinter(IntPtr   hPrinter);
                }
               
                //点击按钮,直接输出字符串到远程打印机
                private   void   button2_Click(object   sender,   EventArgs   e)
                {
                        if   (printStr   ==   " "   ||   printStr   ==   null)
                        {
                                MessageBox.Show( "对不起,现在没有要打印的数据! ");
                        }
                        else  
                        {
                                System.IntPtr   lhPrinter   =   new   System.IntPtr();

                                DOCINFO   di   =   new   DOCINFO();
                                int   pcWritten   =   0;

                                PrintDirect.OpenPrinter( "\\\\192.168.112.5\\1150PCL   5e ",   ref   lhPrinter,   0);
                                PrintDirect.StartDocPrinter(lhPrinter,   1,   ref   di);
                                PrintDirect.StartPagePrinter(lhPrinter);

                                myReader   =   new   StringReader(this.richTextBox1.Text);



                                try
                                {
                                        PrintDirect.WritePrinter(lhPrinter,   ds.Tables[ "print "].Rows[0][ "data "].ToString(),   printStr.Length,   ref   pcWritten);
                                }
                                catch   (Exception   ee)
                                {
                                        Console.WriteLine(ee.Message);
                                }

                                PrintDirect.EndPagePrinter(lhPrinter);
                                PrintDirect.EndDocPrinter(lhPrinter);
                                PrintDirect.ClosePrinter(lhPrinter);
                        }
                }
}

PS:
打印代码为:
PrintDirect.WritePrinter(lhPrinter,   ds.Tables[ "print "].Rows[0][ "data "].ToString(),   printStr.Length,   ref   pcWritten);

ds.Tables[ "print "].Rows[0][ "data "].ToString()//这是一段带格式的字符串



[解决办法]
乱码?会不会是编码没有统一啊
[解决办法]
ms-help://MS.MSDNQTR.2003FEB.2052/gdi/prntspol_93g2.htm
[解决办法]
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WIN32COM.v10.en/gdi/prntspol_93g2.htm
[解决办法]
编码问题吧?CharSet 里改一下看看
1、试下byte[] 编码格式,
这个api用的是本机编码的吧,在形成byte[]时用Encoding的unicode编码,或者UTF8编码试下,在System.Text里,
不过得将声明改一下
[DllImport( "winspool.Drv ", CallingConvention=CallingConvention.StdCall, CharSet=CharSet.??, SetLastError=true, ExactSpelling=true)]
public static extern bool WritePrinter(IntPtr hPrinter, byte[] pBytes, int dwCount, ref int dwWritten);

2、可能是驱动问题,驱动程序不正确就打印不了中文!因为很多激光和喷墨打印机都没有汉字库,所以无法直接打印中文,在Windows下只有借助驱动程序,打印机才可以打印中文!
[解决办法]
请试下解决方法1
[解决办法]
try
LPBYTE lpData ===> System.IntPtr;
string str = ...
System.IntPtr lpdata = System.Text.Encoding.Default.GetBytes( str );

热点排行