【问题标题】:Out String Parameter Not Returned From COM Interop未从 COM 互操作返回输出字符串参数
【发布时间】:2011-11-28 08:26:13
【问题描述】:

我有一个 ATL COM 组件方法,它有一个 [out] BSTR* 参数。我已经从我的 .NET 应用程序中创建了对该组件的引用,该应用程序将参数视为输出字符串类型。 COM 组件像这样分配这个字符串:

    USES_CONVERSION;
    *sText = SysAllocString(T2OLE(psText));

其中 psText 是一个字符*

但是,当方法调用返回时,.NET 代码仍然有一个空字符串。任何人都可以看到有什么问题吗?

【问题讨论】:

  • 你能在这里发布完整的功能吗?它的声明和实际的 psText 是什么?
  • 您使用的是哪个版本的 ATL?
  • 当 psText 是 char* 时,您应该使用 A2OLE()。
  • 此调用是否需要编组(称为进程间或 .NET 和 COM 组件不在同一个单元中)?
  • 这对返回值有什么影响?

标签: c# .net com com-interop


【解决方案1】:

代码没有错,但 .Net 运行时可能过于愚蠢而无法解析间接。您可能希望将您的 IDL 改写为:

HRESULT DoSomething([in] BSTR arg, [out] BSTR *result);

到:

HRESULT DoSomething([in] BSTR arg, [out, retval] BSTR *result);

第一个语法将在 C# 中产生:

string result;
void DoSomething(string arg, out result);

第二个:

string result = DoSomething(arg);

任何 8 位到 16 位的 Unicode 转换都必须通过 SysAllocString,因为 outout, retval 都要求调用者释放字符串。但是,.Net-runtime 如果被告知这是返回值,可能会得到更好的结果;

【讨论】:

  • 那没有任何区别。不过还是谢谢。
【解决方案2】:

如果您的 ATL COM 组件是使用 UNICODE 标志编译的,T2OLE 将不执行任何操作。如果 psText 确实是 char *,则必须使用 A2OLE 确保将字符串转换为 UNICODE。 .NET 封送代码不支持“二进制 BSTR”,即带有非 UNICODE 字符的 BSTR。

【讨论】:

  • 它不是用 UNICODE 标志编译的
【解决方案3】:

如果您更换了 CHAR/WCHAR,则不会出现问题

*sText = SysAllocString(T2OLE(psText));

*sText = CComBSTR(psText).Detach();

CComBSTR 构造函数会自动应用转换。

【讨论】:

  • 这也没什么区别
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2014-07-02
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多