c#-将字符缓冲区从.NET传递到COM并重新更新
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-将字符缓冲区从.NET传递到COM并重新更新,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1432字,纯文字阅读大概需要3分钟。
内容图文
我有以下从C#调用的COM方法,该方法在提供的缓冲区pchText中返回一个字符串(不一定以零结尾),并在pcch中复制字符数:
HRESULT Next([in, out] long* pcch, [out, size_is(*pcch)] OLECHAR* pchText);
如何为互操作定义C#签名?
到目前为止,我已经尝试过了:
void Next(ref int pcch,
[MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 0)]
System.Text.StringBuilder pchText);
它似乎可以工作,但是我不确定SizeParamIndex是否对StringBuilder有影响.
解决方法:
好吧,正确调用当然是一个困难的函数.您的声明大致上是可以的,您只需要应用[PreserveSig]属性并将返回值类型设置为int,就可以发现一个S_FALSE返回值,该值指示没有下一个元素.
困难在于必须预先猜测要传递多少StringBuilder.本机代码获取指向GC堆的原始指针,指向构建器缓冲区,因此事故非常致命.您必须预先猜测构建器的适当容量,并将其作为初始pcch参数传递.
函数返回后,编组器确实注意SizeParamIndex.它将仅复制ppch指示的字符.如果由于某种原因写入的内容超出了缓冲区的容量,则该程序将立即终止,并显示ExecutionEngineException,因为这表明GC堆已损坏.
请注意,如果您猜测容量太低,则不一定能发现这一点.当函数仅复制适合的多个字符且不返回错误代码时,您可能会得到截断的字符串.找出是否存在问题的最佳方法是仅对其进行测试并有意通过一个小型构建器.注意返回值.
值得一提的是,该功能签名击中了COM早期的一种常见攻击,实际上是通过OLECHAR *返回二进制数据而不是文本.有一个很强的提示,因为不能保证该字符串以零结尾.在.NET中,这并不能很好地完成,当对字符串进行规范化时,数据将被破坏.当数据碰巧匹配utf-16代理字符之一时,使程序崩溃.如果是这种情况,则需要short []而不是StringBuilder.
内容总结
以上是互联网集市为您收集整理的c#-将字符缓冲区从.NET传递到COM并重新更新全部内容,希望文章能够帮你解决c#-将字符缓冲区从.NET传递到COM并重新更新所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。