从FaxOutgoingJob获取传真号码

时间:2015-06-25 02:10:08

标签: c# fax

我正在尝试从IFaxOutgoingJob获取传真号码,但一直收到COM错误。

FaxServer g_objFaxServer = new FaxServer();
IFaxServer fs = (IFaxServer)g_objFaxServer;

//connection logic...

IFaxOutgoingQueue oq = fs.Folders.OutgoingQueue;
FaxOutgoingJobs jobs = oq.GetJobs();

string fx = "13101230000";

FaxOutgoingMessageIterator iter = oa.GetMessages();
iter.MoveFirst();  //iter = oa oa=>outgoingarchive = already sent
while (!iter.AtEOF)
{
     ...
     if (iter.Message.Recipient.FaxNumber == fx)
     {
         System.Console.WriteLine("orig sched time: {0},  #: {1},  fn: {2}", 
                                         iter.Message.OriginalScheduledTime,
                                         iter.Message.Recipient.FaxNumber,
                                         iter.Message.DocumentName);
     }
     iter.MoveNext();
}
foreach (IFaxOutgoingJob j in jobs)  //jobs=outgoingqueue = to be sent
{
    if (j.Recipient.FaxNumber == fx) // <------------possible error?
    {
        System.Console.WriteLine("orig sched time: {0},  #: {1},  fn: {2}", 
                                                  j.OriginalScheduledTime,
                                                  j.Recipient.FaxNumber,
                                                  j.DocumentName);
    }
}

我无法在这种环境中进行真正的调试,因此无法弄清楚发生了什么。当它试图访问j.Recipient.FaxNumber时似乎发生错误,因为调用跟踪表示存在错误,调用IFaxOutgoingJob.get_Recipient()。

附带问题是FaxOutgoingJob,而IFaxOutgoinJob似乎也有同样的目的。为什么会使用IFaxOutgoingJob来对抗另一个?我知道我是界面,但如果他们做同样的事情,那么为什么有两个人真的没有意义。

2 个答案:

答案 0 :(得分:0)

当您尝试阅读信息时,Recipient属性不可用。我首先建议您检查j.Recipient == null,但是如果您在get_Recipient内收到错误可能会有所帮助。

另一个选择是将整个代码块包装在`try ... catch(COMException ex)'块中,并跳过那些无法读取收件人的代码块。你需要回来然后以某种方式重试那些。

要回答关于FaxOutgoingJob vs IFaxOutgoingJob的问题,如果您打算进行任何类型的COM编程,您需要了解类和接口之间的区别。但是,简而言之:

  • 接口,如IFaxOutgoingJob,只是一个合同 - 它是一个属性和方法列表,您可以用它们以明确定义的方式与其他系统进行通信。界面本身不会任何事情。如果您有一个公开该接口的对象,它只会告诉您可以做什么。
  • 一个类,如FaxOutgoingJob实现一个接口,当它想让其他人使用它时。通过这样做,它承诺它可以完成界面所说的所有事情。它确实使界面属性和方法真正做了一些事情。

在COM中,接口是特殊的,因为COM客户端和COM库之间的所有交互都是通过接口进行的。 C#隐藏了你的所有血腥细节,但如果你想使用COM对象,你必须通过界面来完成它。但是在C#中,你不能“只使用接口”,因为它们不是对象 - 你不能创建它们。因此,C#“导入库”创建了一个类,其唯一目的是成为接口可以附加到的“骨架”。

您永远不应该直接使用该类,因为COM接口系统将不知道如何处理它。你真正需要使用这样的类的唯一一次是当你创建一个新对象时,你会做类似的事情:

var newFax = new FaxOutgoingJob as IFaxOutgoingJob;

从他们开始,像往常一样使用界面。

答案 1 :(得分:-1)

好的,我觉得这很糟糕。我认为我的代码存在缺陷。

&#39;作业&#39;在第二个for循环块中是我重用的旧的 而且它没有被刷新,这就是为什么它以后找不到它的原因 一段时间过去了(特别是几分钟),特别是 找到工作后。