繁体   English   中英

如何调用从C#获取指向BSTR的指针的COM方法

[英]How to call a COM method that takes a pointer to a BSTR from c#

我正在尝试从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 );

您应该使用ref说明符。 请参阅“ 字符串的默认封送处理”中的示例,尤其是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);
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM