添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
I am trying to develop a simple application to print different kind of documents.
I am using winspool api. My problem is, document is added in printer queue and its showing status printing. but its not printing. WritePrinter returning true but its not printing. i am stuck in this.
any help will appreciated, anyone has idea to find errors and any correct my code.
beside this i can use other way also (but don't want to use Process or ProcessInfo class). I want to print silently from my application.
What I have tried:
[ 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, CharSet = CharSet.Auto, SetLastError = true )] [return: MarshalAs(UnmanagedType.Bool)] public static extern Boolean SetDefaultPrinter( String name); [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 ; // Assume failure unless you specifically succeed. di.pDocName = " Document" ; di.pDataType = " RAW" ; // Open the printer. if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr .Zero)) if (hPrinter.ToInt32() == 0 ) return false ; // Printer not found!! // Start a document. if (StartDocPrinter(hPrinter, 1 , di)) // Start a page. if (StartPagePrinter(hPrinter)) // Write your bytes. bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten); EndPagePrinter(hPrinter); EndDocPrinter(hPrinter); ClosePrinter(hPrinter); // If you did not succeed, GetLastError may give more information // about why not. if (bSuccess == false ) dwError = Marshal.GetLastWin32Error(); return bSuccess; public static bool SendFileToPrinter( string szPrinterName, string szFileName) bool bSuccess = false ; // Open the file. FileStream fs = new FileStream(szFileName, FileMode.Open); // Create a BinaryReader on the file. BinaryReader br = new BinaryReader(fs); // Dim an array of bytes big enough to hold the file's contents. Byte[] bytes = new Byte[fs.Length]; // Your unmanaged pointer. IntPtr pUnmanagedBytes = new IntPtr ( 0 ); int nLength; nLength = Convert.ToInt32(fs.Length); // Read the contents of the file into the array. bytes = br.ReadBytes(nLength); // Allocate some unmanaged memory for those bytes. pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength); // Copy the managed byte array into the unmanaged array. Marshal.Copy(bytes, 0 , pUnmanagedBytes, nLength); // Send the unmanaged bytes to the printer. bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength); // PrintText(szPrinterName, pUnmanagedBytes, nLength); // Free the unmanaged memory that you allocated earlier. Marshal.FreeCoTaskMem(pUnmanagedBytes); br.Close(); fs.Close(); catch (Exception ex) { string s = ex.Message.ToString(); } return bSuccess;
  • Read the question carefully.
  • Understand that English isn't everyone's first language so be lenient of bad spelling and grammar.
  • If a question is poorly phrased then either ask for clarification, ignore it, or edit the question and fix the problem. Insults are not welcome.
  • Don't tell someone to read the manual. Chances are they have and don't get it. Provide an answer or move on to the next question. Let's work to help developers, not make them feel stupid.
  •