WCHAR в COM-интерфейсах - это хорошо? - PullRequest
2 голосов
/ 11 мая 2011

WCHAR в COM-интерфейсах - это хорошо?

Я искал в интернете ответ на этот вопрос безрезультатно.

В основном следует использовать char * / wchar * в COM или использовать вместо него BSTR?

Это безопасно или зависит?

В этом примере кода его строки (код взят из случайного источника):

STDMETHOD(SetAudioLanguageOrder(WCHAR *nValue)) = 0; 
STDMETHOD_(WCHAR *, GetAudioLanguageOrder()) = 0;

Я не совсем понимаю, когда использовать что-либо со всеми маршалингом, границами памяти и т. Д., Возникающими при разговоре о COM.

А как насчет буферов данных (байт *)?

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

Это зависит от контекста, в котором звонящий вам позвонит.Во-первых, если вы используете неавтоматизированный тип, маршалинг для вас не будет выполняться автоматически.Следовательно, вам придется написать собственный маршалер для перемещения wchar_t * через границы процесса.

Тем не менее, нет правила, согласно которому вы не можете передать wchar_t * в COM-интерфейс.Есть много COM-интерфейсов, которые передают пользовательские типы (структуры, указатели на структуры, обратные вызовы и т. Д.), И все это только для ваших нужд.

В вашем интерфейсе, если вы используете строки WCHAR, я бы объявилSetAudioLanguageOrder следующим образом:

STDMETHOD(SetAudioLanguageOrder(const WCHAR *nValue)) = 0;

Это делает более понятным, кто (не) должен освободить строку, и предоставляет больше контекста о том, как обрабатывать строку (вызывающему не рекомендуется изменять строку, хотявызывающий может, конечно, вызвать такое поведение, если он хочет написать плохой код).

Вызов GetAudioLanguageOrder в порядке, но теперь возникает вопрос: кто освобождает возвращаемую строку и как ее следует освободить?Через бесплатный (...)?Или C ++ удалить []?Если вы используете BSTR, то вы знаете - используйте SysFreeString.Это одна из причин использования BSTR вместо строк WCHAR.

1 голос
/ 11 мая 2011

Если вы собираетесь поддерживать двойные интерфейсы и клиенты, отличные от C ++, используйте BSTR.Если все абоненты C ++, то с WCHAR * все в порядке.

0 голосов
/ 11 мая 2011

Вы должны будете иметь возможность узнать длину этого массива тем или иным способом.В C или C ++ обычно используются строки с нулевым символом в конце, и вы часто используете их в одном процессе - вызываемый объект получает доступ к тем же данным, что и обработчик, подготовленный и завершается нулем.Возможно, вы захотите создать сервер out-proc или использовать ваш сервер in-proc в суррогатном процессе, и тогда вам потребуется маршаллинг - механизм промежуточного программного обеспечения, который передает эти данные между процессами или потоками - для работы.Этот механизм не будет знать о размере строки, если вы не укажете один из атрибутов MIDL, например size_is, чтобы указать правильный размер массива.Использование этих атрибутов потребует дополнительного параметра для каждого массива - что усложняет интерфейс и требует особой осторожности при работе с данными.

Тем не менее, в большинстве случаев вы получаете более гибкий интерфейс, просто используя BSTR s..

...