繁体   English   中英

来自C ++ COM的C#字符串

[英]String for C# from C++ COM

我有一个C ++ DLL,一些函数返回Unicode以null结尾的字符串:

void SomeFunc(wchar_t* StrBuf)

调用者必须分配StrBuf - 字符串最多可以包含256个字符。 此DLL还公开COM对象以通过COM从C#使用此DLL。 IDL中的定义:

[id(1), helpstring("bla")]
HRESULT SomeFunc([in,out] BSTR* TextStr, [out,retval] LONG* RetValue);

目前C#代码如下所示:

string val = new string('\0', 256); // Allocate memory
MyComObj.SomeFunc(ref val); // Get string
val = val.Substring(0, val.IndexOf('\0')); // Convert from null-terminated string

有没有办法定义这样的COM函数,以便从C#中使用它更容易? 现在它看起来很丑,如果函数有两个字符串参数,则需要三行来调用函数或五行。

如果客户端中字符串的内存分配并将其填充到COM服务器,则必须使用StringBuilder:

// IDL code
HRESULT GetStr(/*[out]*/ LPSTR pStr);

// Interop
void GetStr(/*[out]*/ [MarshalAs(UnmanagedType.LPStr)] StringBuilder pStr);

// C# code
var str = new StringBuilder(256);
MyComObj.GetStr(a);

然后StringBuilder将为空或填充字符。

解决了。 在C ++中,我在COM包装器中使用此代码:

STDMETHODIMP MyClassClass::SomeFunc(BSTR* OptionValue, LONG* RetValue)
{
    *RetValue = 0;
    UNICODECHAR txt[MAXSTATSTRLEN];

    //... Copy text to txt variable
    *OptionValue = W2BSTR(txt);
    return S_OK;
}

IDL:

[id(1), helpstring("")] HRESULT SomeFunc([out] BSTR* OptionValue, [out,retval] LONG* RetValue);

在C#中,现在可以轻松调用它:

string val;
MyComObj.SomeFunc(out val);

如果将此公开为COM对象,只需使用visual studio添加对象的引用即可。 它会自动为你生成一个程序集(我相信它们称之为COM可调用包装器)。

除非您开始尝试传递某些自定义结构,否则这会将您的COM对象方法暴露给.NET并起作用。

以下是一些资源:

COM Callable Wrapper

COM Interop第1部分:C#客户端教程

暂无
暂无

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

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