com - COM 接口(interface)中的 WCHAR 是好事吗?

标签 com interface bstr wchar

COM 接口(interface)中的 WCHAR 是好事吗?

我一直在互联网上寻找这个问题的答案,但没有任何结果。

基本上应该在 COM 中使用 char*/wchar* 还是应该使用 BSTR 代替?

它是安全的还是取决于它?

在此代码示例中,它的字符串(从随机来源获取的代码):

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

当谈到 COM 时,我对何时使用所有编码、内存边界等内容感到困惑。

数据缓冲区(字节*)呢?

最佳答案

这取决于调用者调用您的上下文。首先,如果您使用非自动化类型,则不会自动为您执行编码。因此,您最终将不得不编写自己的编码(marshal)拆收器来跨进程边界移动 wchar_t*。

也就是说,没有规定不能在 COM 接口(interface)中传递 wchar_t*。有许多 COM 接口(interface)可以传递自定义类型(结构、指向结构的指针、回调等),这完全取决于您的需求。

在您的界面中,如果您确实使用 WCHAR 字符串,我会这样声明 SetAudioLanguageOrder:

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

这使得更清楚谁(不)应该释放字符串,并提供更多关于如何处理字符串的上下文(不鼓励调用者修改字符串,尽管调用者如果想编写错误的代码当然可以强制执行该行为)。

GetAudioLanguageOrder 调用没问题,但现在的问题是:谁释放返回的字符串,应该如何释放?通过免费(...)?还是 C++ 删除[]?如果您使用 BSTR,那么您知道 - 使用 SysFreeString。这是使用 BSTR 而不是 WCHAR 字符串的部分原因。

关于com - COM 接口(interface)中的 WCHAR 是好事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5956072/

相关文章:

c# - 如何处理 COM 互操作中的 var(或 ref)参数?

未找到 PHP 类 'COM'

java - 如何实现一个消息发送系统?

c++ - WScript.CreateObject 在调用 C++ COM dll 函数时返回空

.NET - 你可以通过接口(interface),什么时候不应该接口(interface)

pointers - 带指针的 Golang 类型断言

c++ - 将 CComBSTR 与 NULL 进行比较

c++ - 将 BSTR 转换为 CString 时出错

c++ - ATL 如何将 BSTR* str 转换为注册表项。SetValue(LPCTSTR str 类型

c# - [ComImport] 是否被视为 P/Invoke?