Its been working fine for the last two years with IE6 on Server 2003. It broke immediately following upgrading to IE7 final.
Here's the script I'm using:
' To use the script, set the printto command for HTML files to
' WSCRIPT.EXE c:\webroot\Print2HTML.vbs "%1" "%2" "%3" "%4"
'rundll32.exe %SystemRoot%\System32\mshtml.dll,PrintHTML "%1" "%2" "%3" "%4"
' Get What Where To Print @ http://home.arcor.de/skanthak/print-to.html#print-to
If (WScript.Arguments.Count <> 4) Then
WScript.Echo "Usage: " & WScript.ScriptName & " <filename> <printer> <driver> <port>"
WScript.Quit 1
End If
MyDocumentPath = WScript.Arguments(0)
MyPrinterName = WScript.Arguments(1)
MyDriverName = WScript.Arguments(2) ' not used
MyPrinterPort = WScript.Arguments(3) ' not used
' Get Default Printer @ http://www.developersdex.com/asp/message.asp p=593&ID=%3C%23kMWFdjGFHA%2E2416%40TK2MSFTNGP14%2Ephx%2Egbl%3E
Set oShell = CreateObject("WScript.Shell")
sRegVal = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"
sDefault = ""
On Error Resume Next
sDefault = oShell.RegRead(sRegVal)
sDefault = Left(sDefault ,InStr(sDefault, ",") - 1)
On Error Goto 0
DefaultPrinter = sDefault
' Set Default Printer To Actual Printer
Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.SetDefaultPrinter MyPrinterName
' Print File In IE Without Promting @ http://www.cygwin.com/ml/cygwin/2003-02/msg00911.html
Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate(MyDocumentPath)
READYSTATE_COMPLETE = 4
Do ' wait until page is loaded
WScript.Sleep 10
Loop Until ie.ReadyState = READYSTATE_COMPLETE
ie.document.body.focus()
OLECMDID_PRINT = 6
OLECMDID_PRINT2 = 49
OLECMDEXECOPT_DONTPROMPTUSER = 2
ie.execWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER
WScript.Sleep 5000 ' let ie some time to print before destroying...
ie.quit
' Restore Default Printer
WshNetwork.SetDefaultPrinter DefaultPrinter
And here's the chunk of code I'm using
using System;
using System.Reflection;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Printing;
using FAXCOMEXLib;
namespace JobSlipGenie
{
public class FaxDoc
{
public string DisplayName="Fax Transmission";
public string CoverpageSubject="";
public string CoverpageNote="";
public string RecipientName="";
public string SenderName="";
public string FileName="";
public string FaxNumber="";
public string TheFile="";
public string ConnectTo="WEBSERVER1";
public string CoverPage="generic";
public FaxDoc()
{}
}
/// <summary>
/// Summary description for Fax.
/// </summary>
public class Fax
{
[DllImport("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, // handle to destination DC
int nXDest, // x-coord of destination upper-left corner
int nYDest, // y-coord of destination upper-left corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
IntPtr hdcSrc, // handle to source DC
int nXSrc, // x-coordinate of source upper-left corner
int nYSrc, // y-coordinate of source upper-left corner
System.Int32 dwRop // raster operation code
);
[DllImport("User32.dll")]
public extern static System.IntPtr GetDC(System.IntPtr hWnd);
[DllImport("User32.dll")]
public extern static int ReleaseDC(System.IntPtr hWnd, System.IntPtr hDC); //modified to include hWnd
public Fax()
{
}
public static string FaxDocument(JobSlipGenie.FaxDoc f)
{
if(f.CoverPage=="none")
f.CoverPage="";
FAXCOMEXLib.FaxServerClass faxsrv = new FAXCOMEXLib.FaxServerClass();
faxsrv.Connect(f.ConnectTo);
faxsrv.Connect(f.ConnectTo);
FAXCOMEXLib.FaxDocumentClass faxdoc = new FAXCOMEXLib.FaxDocumentClass();
try
{
faxdoc.CoverPageType=FAXCOMEXLib.FAX_COVERPAGE_TYPE_ENUM.fcptSERVER;
faxdoc.Recipients.Add(f.FaxNumber,f.RecipientName);
faxdoc.CoverPage = f.CoverPage;
faxdoc.Subject = f.CoverpageSubject;
faxdoc.Note = f.CoverpageNote;
faxdoc.DocumentName=f.DisplayName;
faxdoc.Body=f.FileName;
if(faxdoc.CoverPage.Length==0)
faxdoc.CoverPageType=FAXCOMEXLib.FAX_COVERPAGE_TYPE_ENUM.fcptNONE;
faxdoc.ConnectedSubmit(faxsrv);
faxsrv.Disconnect();
}
catch (Exception ex)
{
return("FAX Error: "+ex.Message.ToString());
}
finally
{
Marshal.ReleaseComObject(faxdoc);
Marshal.ReleaseComObject(faxsrv);
}
return("FAX Successful");
}
}
/// <summary>
/// Custom PrintController for fax printing
/// </summary>
public class FaxPrintController: StandardPrintController
{
public string DocName = null;
public string RecipientName = null;
public string RecipientNumber = null;
public string SenderName = null;
public string SenderCompany = null;
public string SenderDept = null;
public string SenderBillingCode = null;
public string Reserved = null;
public string DrEmailAddress = null;
public string OutputFileName = null;
public string PrinterName = "";
private IntPtr hDC;
public FaxPrintController(string printer)
{
PrinterName = printer;
}
public override void OnStartPrint(PrintDocument document, PrintEventArgs e)
{
base.OnStartPrint (document, e);
if ( this.OutputFileName == string.Empty )
this.OutputFileName = Path.GetTempFileName();
FAX_PRINT_INFO fpi = new FAX_PRINT_INFO();
fpi.DocName = this.DocName;
fpi.DrEmailAddress = this.DrEmailAddress;
fpi.OutputFileName = this.OutputFileName;
fpi.RecipientName = this.RecipientName;
fpi.RecipientNumber = this.RecipientNumber;
fpi.SenderName = this.SenderName;
FAX_CONTEXT_INFO fci = new FAX_CONTEXT_INFO();
fci.Initialize();
uint jobID;
int ret = FaxStartPrintJob(PrinterName, fpi, out jobID, ref fci);
int err = Marshal.GetLastWin32Error();
hDC = fci.hDC;
typeof(StandardPrintController).GetField("dc", BindingFlags.NonPublic|BindingFlags.Instance).SetValue(this, fci.hDC);
}
public override Graphics OnStartPage(PrintDocument document, PrintPageEventArgs e)
{
Graphics g = Graphics.FromHdc(hDC);
typeof(StandardPrintController).GetField("graphics", BindingFlags.NonPublic|BindingFlags.Instance).SetValue(this, g);
return g;
}
[DllImport("winfax", SetLastError=true)]
extern static int FaxStartPrintJob(string PrinterName,
FAX_PRINT_INFO PrintInfo,
out uint FaxJobId,
ref FAX_CONTEXT_INFO FaxContextInfo
);
}
[StructLayout(LayoutKind.Sequential)]
public class FAX_PRINT_INFO
{
public int SizeOfStruct = Marshal.SizeOf(typeof(FAX_PRINT_INFO));
[MarshalAs(UnmanagedType.LPStr)]public string DocName = null;
[MarshalAs(UnmanagedType.LPStr)]public string RecipientName = null;
[MarshalAs(UnmanagedType.LPStr)]public string RecipientNumber = null;
[MarshalAs(UnmanagedType.LPStr)]public string SenderName = null;
[MarshalAs(UnmanagedType.LPStr)]public string SenderCompany = null;
[MarshalAs(UnmanagedType.LPStr)]public string SenderDept = null;
[MarshalAs(UnmanagedType.LPStr)]public string SenderBillingCode = null;
[MarshalAs(UnmanagedType.LPStr)]public string Reserved = null;
[MarshalAs(UnmanagedType.LPStr)]public string DrEmailAddress = null;
[MarshalAs(UnmanagedType.LPStr)]public string OutputFileName = null;
}
[StructLayout(LayoutKind.Sequential)]
public struct FAX_CONTEXT_INFO
{
public void Initialize()
{
SizeOfStruct = Marshal.SizeOf(typeof(FAX_CONTEXT_INFO));
}
public int SizeOfStruct;
public IntPtr hDC;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=16)]public string ServerName;
}
}
And this is how it gets called in the main part of the software
private void FAXHtml(string AccountName,string FAXNum,string body)
{
string PrintJobFile=Path.GetTempFileName().Replace(".tmp","")+".html";
StreamWriter sw=new StreamWriter(PrintJobFile,false);
sw.Write(body);
sw.Close();
FaxDoc f=new FaxDoc();
f.FaxNumber=FAXNum;
f.SenderName=companyName;
f.RecipientName=Name;
f.CoverpageSubject=subj;
f.CoverPage="";
f.DisplayName="Job Status for "+AccountName;
f.FileName=PrintJobFile;
Fax.FaxDocument(f);
}