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
;
di.pDocName =
"
Document"
;
di.pDataType =
"
RAW"
;
if
(OpenPrinter(szPrinterName.Normalize(),
out
hPrinter,
IntPtr
.Zero))
if
(hPrinter.ToInt32() ==
0
)
return
false
;
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)
bool
bSuccess =
false
;
FileStream fs =
new
FileStream(szFileName, FileMode.Open);
BinaryReader br =
new
BinaryReader(fs);
Byte[] bytes =
new
Byte[fs.Length];
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();
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.