使用C# 实现直接操作dc 发传真 FaxStartPrintJob does't work

bruce007 2004-10-27 10:19:38
我现在已经能使用
FaxServerClass fsc = new FaxServerClass();
try
{
fsc.Connect("");

FaxDoc doc = (FaxDoc) fsc.CreateDocument(@"c:\Off.bmp");
doc.FaxNumber = "8915";
doc.RecipientName = "tester";
int i = doc.Send();

}
catch
{
MessageBox.Show("fail to commit file!");
}
finally
{
fsc.Disconnect();
}
但是我想在发传真时, 得到fax 得 device context 直接朝 dc drawstring 或 drawImage
我知道基本得思路是要用到 FaxStartPrintJob SDK。 但下面的代码好象不行, 请高手帮看看。

IntPtr hServer = IntPtr.Zero;
FaxPrintInfo printInfo = new FaxPrintInfo();
printInfo.RecipientNumber = "8915";
printInfo.SizeOfStruct = System.Runtime.InteropServices.Marshal.SizeOf(printInfo);
printInfo.Reserved = null;
printInfo.OutputFileName = null;


FaxContextInfo contextInfo = new FaxContextInfo();
contextInfo.SizeOfStruct = System.Runtime.InteropServices.Marshal.SizeOf(contextInfo);
IntPtr jobId = IntPtr.Zero;

FaxDrill.FaxConnectFaxServer(null, ref hServer);
FaxDrill.FaxStartPrintJob(null, ref printInfo, jobId, ref contextInfo);

Graphics g = Graphics.FromHdc(contextInfo.hDC);
g.DrawImage(new Bitmap("c:\\Greenstone.bmp"), 0, 0);

FaxDrill.EndDoc(contextInfo.hDC);
FaxDrill.FaxClose(hServer);
[StructLayout( LayoutKind.Sequential)]
public class FaxPrintInfo
{
public Int32 SizeOfStruct; // structure size, in bytes
public String DocName; // pointer to document name to display
public String RecipientName; // pointer to recipient's name
public String RecipientNumber; // pointer to recipient's fax number
public String SenderName; // pointer to sender's name
public String SenderCompany; // pointer to sender's company
public String SenderDept; // pointer to sender's department
public String SenderBillingCode; // pointer to billing code
public String Reserved; // must be set to NULL
public String DrEmailAddress; // pointer to e-mail address
public String OutputFileName; // reserved; must be NULL
}

[StructLayout( LayoutKind.Sequential)]
public class FaxContextInfo
{
public Int32 SizeOfStruct; // structure size, in bytes
public IntPtr hDC; // handle to a device context
public String ServerName;
}



public class FaxDrill
{
public FaxDrill()
{
}


[DllImport("winfax.dll", EntryPoint = "FaxConnectFaxServer")]
public static extern bool FaxConnectFaxServer(String machineName, ref IntPtr hServer);

[DllImport("winfax.dll", EntryPoint = "FaxClose")]
public static extern bool FaxClose(IntPtr hServer);


[DllImport("winfax.dll", EntryPoint = "FaxStartPrintJob")]
public static extern bool FaxStartPrintJob(String printerName, ref FaxPrintInfo printInfo, IntPtr faxJobID, ref FaxContextInfo faxContextInfo);

[DllImport("gdi32.dll", EntryPoint = "EndDoc")]
public static extern bool EndDoc(IntPtr hdc);
}

...全文
395 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovemory 2005-06-24
  • 打赏
  • 举报
回复
上面的代码可以发送传真,但在群发传真的时候,比如我在很短的时间内发送5封,只有4封能添加到传真控制台的发件箱。
lovemory 2005-06-24
  • 打赏
  • 举报
回复
/// <summary>
/// ////发送传真的方法,传递三个参数
/// </summary>
/// <param name="faxFile"></param>
/// <param name="faxNumber"></param>
/// <param name="hostName"></param>
public void sendFax(string faxFile ,string faxNumber,string hostName)
{

FileInfo f = new FileInfo(faxFile);
if(f.Exists)
{
FAXCOMLib.FaxServer faxsvr = null;
FAXCOMLib.FaxDoc faxdoc = null;
try
{
faxsvr = new FAXCOMLib.FaxServer();
faxdoc = (FAXCOMLib.FaxDoc)faxsvr.CreateDocument(f.FullName);
}
catch(Exception ex)
{
errorMessage = ex.Message;
writeFile("create error! " + errorMessage);

}
try
{
faxsvr.Connect(hostName); // or specify the computer name
}
catch (Exception ex )
{
errorMessage = ex.Message;
writeFile("link host "+hostName+ " error! " + errorMessage);
}

try
{

faxdoc.FaxNumber =faxNumber;// Specify the Fax Number;
intsend = faxdoc.Send();
//System.Threading.Thread.Sleep(2000);
//faxsvr.Disconnect();
writeFile("send successfully["+intsend+"] " + f.FullName + " " +"(faxNumber: " +faxNumber +";hostName: " +hostName+ ")");
}
catch ( Exception ex )
{
errorMessage = ex.Message;
writeFile("send error["+intsend+"] " +f.FullName+" "+errorMessage + "(faxNumber: " +faxNumber +";hostName: " +hostName+")");
//System.Threading.Thread.Sleep(5000);

}

}
else
{
errorMessage = "error:"+faxFile +"not exist !";
writeFile(errorMessage);
}

}
manonroad 2005-04-26
  • 打赏
  • 举报
回复
我正打算写一个组件在服务器端发送传真。关注中,顶一下。。。。
michleliu 2005-03-09
  • 打赏
  • 举报
回复
我正好要学习这个,,帮顶。。。
bruce007 2004-11-07
  • 打赏
  • 举报
回复
自己再顶一下。 看来csdn的高手也很有限的喔。 各位高手不用生气喔。
jkflyfox 2004-10-31
  • 打赏
  • 举报
回复
我发过,但是也只用用楼主的第一种方法。
帮顶吧,不要沉了。
bruce007 2004-10-31
  • 打赏
  • 举报
回复
看来这个100分又泡汤了 , 就没有一个人在winform下用编程方式发传真吗? 晕!
xiaoslong 2004-10-31
  • 打赏
  • 举报
回复
帮顶
bruce007 2004-10-27
  • 打赏
  • 举报
回复
net_lover(孟子E章) 大哥:
我可能写得比较乱: 我得目的就是要在C#中使用 FaxStartPrintJob。 只有这样才能 将自己要打印的内容 比较报表 图像, 放到一个fax 中发出去。
孟子E章 2004-10-27
  • 打赏
  • 举报
回复
这是一个asp 的例子,你可以参考一下
http://support.microsoft.com/default.aspx?scid=kb;en-us;303647&Product=asp
bruce007 2004-10-27
  • 打赏
  • 举报
回复
可能我写得比较乱, 我要实现得就是 将 FaxStartPrintJob 移植到 .net 托管代码中。 望高手指点。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧