Как передать bool из c # через c ++ com интерфейс в idl - PullRequest
3 голосов
/ 04 августа 2009

Я знаю, что упускаю что-то простое, у меня почти нет опыта работы с этими ком-вещами.

Я хотел бы сделать это в интерфейсе в idl

[id(5), helpstring("Returns true if the object is in a valid state.")]
HRESULT IsValid([out, retval] boolean bValid);

Однако это дает: [out] параметр не является указателем.

Хорошо, я понимаю.

Однако в коде C #, реализующем это, я не могу вернуть bool * из метода IsValid (), потому что это небезопасно.

Как мне правильно вернуть логическое значение?

1 Ответ

7 голосов
/ 04 августа 2009

Попробуйте:

HRESULT IsValid([out, retval] VARIANT_BOOL *bValid);

Чтобы работать как выход, он должен быть указателем на значение; вот как это будет написано на стороне C ++:

*bValue = VARIANT_TRUE;

Я не знаю, можете ли вы написать тип как boolean - я только когда-либо видел, чтобы VARIANT_BOOL использовался.

На стороне C # оно станет эквивалентным:

public bool IsValid()

Другими словами, вызываемая оболочка во время выполнения (RCW) реализует «более приятную» версию сигнатуры метода и позаботится о небезопасном переводе. Если реализация C ++ возвращает E_FAIL (или E_WHATEVER), тогда метод RCW выдаст ComException.

Вы можете также рассмотреть возможность добавления атрибута [propget], который сделает IsValid доступным как свойство вместо метода. Как и с любым свойством, делайте это только в том случае, если его анализ дешевый и не имеет побочных эффектов (отладчик будет оценивать его при прохождении кода C #).

...