【问题标题】:How to call a COM method that takes a pointer to a BSTR from c#如何调用从 C# 获取指向 BSTR 的指针的 COM 方法
【发布时间】:2011-12-03 09:02:30
【问题描述】:

我正在尝试从 c# 调用以下“foo”COM 方法:

interface IFoo : public IUnknown
{
    virtual HRESULT __stdcall foo( BSTR * log ) = 0;
}

这是我在 c# 中的声明方式:

[ComImport, Guid( "98D93A58-2889-43a5-A182-47DEE781D41E" ),
 InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IFoo
{
    void foo( out string log );
}

这是我在 c# 中的调用方式: (x 是实现 IFoo 的 COM 类的一个实例)

string log;
x.foo( out log );

当我运行这段代码时,我得到以下异常:

System.Runtime.InteropServices.MarshalDirectiveException was unhandled
  Message=Marshaler restriction: Excessively long string.

我做错了什么?

顺便说一句,如果我从 c++ 中调用“foo”,则以下内容可以正常工作:

CComBSTR log;
pX->foo( &log );

【问题讨论】:

  • 我认为您不需要 C# 端的 out 说明符。
  • 你可以控制IFoo 吗?如果您可以将 BSTR* 更改为 LPSTR*,则可以使用 StringBuilder 而不是 String - 这就是为我解决此错误的原因

标签: c# interop marshalling


【解决方案1】:

您应该使用ref 说明符。请参阅Default Marshaling for Strings 的示例,尤其是 PassStringRef1 和 PassStringRef2。

The following example shows strings declared in the IStringWorker interface.
Visual C++

public interface IStringWorker {
void PassString1(String s);
void PassString2([MarshalAs(UnmanagedType.BStr)]String s);
void PassString3([MarshalAs(UnmanagedType.LPStr)]String s);
void PassString4([MarshalAs(UnmanagedType.LPWStr)]String s);
void PassStringRef1(ref String s);
void PassStringRef2([MarshalAs(UnmanagedType.BStr)]ref String s);
void PassStringRef3([MarshalAs(UnmanagedType.LPStr)]ref String s);
void PassStringRef4([MarshalAs(UnmanagedType.LPWStr)]ref String s);
);

The following example shows the corresponding interface described in a type library.

[…]
interface IStringWorker : IDispatch {
HRESULT PassString1([in] BSTR s);
HRESULT PassString2([in] BSTR s);
HRESULT PassString3([in] LPStr s);
HRESULT PassString4([in] LPWStr s);
HRESULT PassStringRef1([in, out] BSTR *s);
HRESULT PassStringRef2([in, out] BSTR *s);
HRESULT PassStringRef3([in, out] LPStr *s);
HRESULT PassStringRef4([in, out] LPWStr *s);
);

【讨论】:

  • 我尝试了 PassStringRef2 示例。这仍然会导致相同的异常:Excessively Long String.
猜你喜欢
  • 2014-09-08
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多