急问,C#的事件响应函数如何传递ref的参数,我对C#不太熟,可能没表达清楚

WheatField 2010-07-23 10:34:19
我用ATL写了一个简单组件,这个组件有事件。事件会传递参数,参数中有CHAR*类型的参数
比如:HRESULT Fire_AcceptEvent( ULONG clientsock, USHORT iPort, CHAR * pcIP)

然后用C#调用这个COM组件,在C#中,组件的事件响应函数原形为:
_IXXXX_AcceptEventEventHandler(uint, ushort, ref sbyte);

我现在在C#中写一个函数,比如:
private void OnClientAccept(uint clientsocket, ushort iPort, ref sbyte pcIP)
{
MessageBox.Show(iPort.ToString());
}

然后,将这个函数加入到事件响应队列:
_IXXXX_AcceptEventEventHandler ClientAccept = new _IXXXX_AcceptEventEventHandler(OnClientAccept);
socket.AcceptEvent += ClientAccept;


现在的问题是,OnClientAccept()的参数并不是我传进去的,ref sbyte这个参数的数据我取得后,只能得到第一个字符的ASCII值,请问,我如何才能获得这个sbyte[]或者是char*的内容?


谢谢
...全文
151 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kissoday 2010-07-23
  • 打赏
  • 举报
回复
學習... 幫頂....
a124819202 2010-07-23
  • 打赏
  • 举报
回复
这个我也不知道,看上去没什么错,传的参数就不是数组得到的当然也不可能是数组了
zagj11 2010-07-23
  • 打赏
  • 举报
回复
学习帮顶
  • 打赏
  • 举报
回复
不懂。。我去叫草坪来看看……
WheatField 2010-07-23
  • 打赏
  • 举报
回复
这是ATL组件的事件,委托参数由系统生成,不是我自己控制的。我要改的话需要改ATL.
ATL中的参数类型最好是char*或者BYTE*。

不过有变通的办法了,在ATL中用BSTR, 在C#中的参数就是string了。
newxdlysk 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wheatfield 的回复:]
问题是如果我写
private void OnClientAccept(uint clientsocket, ushort iPort, ref sbyte[] pcIP)
编译提示: 函数的重载均与委托不匹配
[/Quote]
你把委托参数类型也改一下
WheatField 2010-07-23
  • 打赏
  • 举报
回复
问题是如果我写
private void OnClientAccept(uint clientsocket, ushort iPort, ref sbyte[] pcIP)
编译提示: 函数的重载均与委托不匹配
wantalcs 2010-07-23
  • 打赏
  • 举报
回复
如果你想用sbyte对应CHAR的话,应该用对应CHAR*的应该是sbyte[],而非单个sbyte。
fenshm 2010-07-23
  • 打赏
  • 举报
回复
学习。帮顶~!
请叫我潇洒哥 2010-07-23
  • 打赏
  • 举报
回复
不懂帮顶 等高手
BaoShiqiang 2010-07-23
  • 打赏
  • 举报
回复
帮顶。。友情Up
WheatField 2010-07-23
  • 打赏
  • 举报
回复
编译提示: 函数的重载均与委托不匹配
兔子-顾问 2010-07-23
  • 打赏
  • 举报
回复
_IXXXX_AcceptEventEventHandler(uint, ushort, ref sbyte);
改成
_IXXXX_AcceptEventEventHandler(uint, ushort, StringBuilder outText);
这样可以么?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧