C#中调用C++写的com时遇到的问题与解决方案

来源:互联网 发布:网络监控机怎么使用 编辑:程序博客网 时间:2024/05/18 02:21

问题:

C++中接口定义如下:

//...

[propget, id(0), helpstring("取得用户昵称")] HRESULT NickName([out,retval] BSTR* pVal);
[propput, id(1), helpstring("设置用户昵称")] HRESULT NickName([in] BSTR newVal);

//...

C#中通过com Interop调用,取得用户昵称返回错误"未将对象引用设置到对象实例",设置用户昵称正常

问题原因(不一定对,但可以解决问题):

在"取得用户昵称"时未对*pVal分配内存

解决方法:

将"[propget, id(0), helpstring("取得用户昵称")] HRESULT NickName([out,retval] BSTR* pVal);"修改为:

[id(0), helpstring("取得用户昵称")] HRESULT GetNickName([in, out] BSTR* pVal);

Interop封装后如下调用:

//.....

String nickName = new String(new Char[25]); //用户昵称长度为25

User.GetNickName(ref nickName); //User为此Com实例化的对象,nickName中即为取得的用户昵称值

//.....

===========================

解决方法不一定好, 若有更好的解决方法请留言, 大家一起探讨