Использование RFCOMAPIlib (RightFax COM API): Невозможно привести COM-объект - PullRequest
2 голосов
/ 18 августа 2011

Я работаю с RightFax COM API. Я хочу просто отправить факс с приложением. Просто верно? На этот вопрос ответили несколько раз. Однако, когда я использую часть этого кода в своем приложении, у меня возникают небольшие проблемы.

Приложение: RightFax 9.4
Язык: C # (приложение ASP.NET)
IDE: MS Visual Web Dev. Экспресс
Целевая среда: .NET 3.5
ОС: Windows 7

using ...
public static void SendFax(<arguments>)
{
    RFCOMPAPILib.FaxServerClass fs = new RFCOMAPILib.FaxServerClass();
    fs.Name = "faxSvrName";
    // BOOM, exception
}

Я даже не понимаю имя сервера.

Сведения об исключении:
Невозможно привести объект COM типа «RFCOMAPILib.FaxServerClass» к типу интерфейса «RFCOMAPILib.Form». Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID '{9F386618-764B-48F8-A5BF-3682B03DE840}' завершился неудачно из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) .

Так. Есть предложения?

1 Ответ

2 голосов
/ 18 августа 2011

Этот интерфейс COM был немного переработан, но шаблон не является необычным. COM-класс COM может реализовывать несколько интерфейсов, один из которых является интерфейсом по умолчанию. Этот механизм не существует в .NET, он не поддерживает множественное наследование или понятие интерфейса по умолчанию. Tlbimp синтезирует поддельный класс-обертку с именем mumbleClass, чтобы обернуть кокласс с именем mumble. Который является сумкой всех методов, реализованных всеми интерфейсами. Сообщение об исключении говорит вам, что интерфейс по умолчанию для Coclass класса FaxServer называется «Форма». И этот RFCOMAPILib.Form не может быть приведен к RFCOMAPILib.FaxServerClass. Не удивительно.

Вам нужно переписать код в нечто похожее на это:

 RFCOMPAPILib.FaxServer fs = new RFCOMAPILib.FaxServerClass();
 fs.Name = "faxSvrName";

Я полностью догадываюсь по имени интерфейса, некоторые шансы для "IFaxServer". Используйте Обозреватель объектов, чтобы найти фактическое имя.

...