- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
下载
第5章 避免常见的RPC编程错误
这一章列出了一系列简单、但却是常见的 R P C编程错误,这些错误是微软 Wi n d o w s应用程序
开发人员在开发过程中应该注意的。
如果您拥有“Wi n 3 2开发人员参考库”套书,由于常见的 R P C编程错误已经包括在其中了,
您可能会对本书的一些信息比较熟悉。然而,我认为这些信息是与这套“网络连接服务开发人
员参考库”、特别是本卷密切相关的,所以我把它放在这里,尽量使您避免一些编程错误。
这一章首先是解决问题方法的概述,它对您应该注意的每一个被编号且加下划线的常见编
码错误给出了简短的解决方法。然后,这一章转向常见的 R P C编程错误,对您在使用R P C编程时
尤其应该注意的问题和错误给出了更进一步的详细说明。
5.1 解决方法概述
这一节对下面各章中解释的每问题提供了一个简短的回答。想获得这些问题中任何一个的
更多信息,请阅读本章随后的相关解释。
1 ) p o i n t e r _ d e f a u l t ( u n i q u e )及嵌套指针:在引用唯一指针之前要检查该指针是否为 N U L L 。
2 ) 在具有R P C 能力的结构中,一个有效的 s w i t c h _ i s取值并不能保证指针为非 N U L L 。在使用
带有缺省从句的s w i t c h _ i s结构时,必须:
• 确认打开( switch on )的值在预定范围之内。
• 在引用打开对象内部的指针之前,确认该指针是非 N U L L 的。
3) 一个NULL DACL 不提供任何保护:所以不要用NULL DACL ,它起不到任何保护作用。
4) 在执行任何一个与安全有关的操作之前,调用 R p c I m p e r s o n a t e C l i e n t ( ) :在代表调用者执
行操作之前先完成假冒( I m p e r s o n a t e )工作,并检查结果。
5) 开始和结束假冒。在代表调用者完成任务之后,要结束假冒,并检查结果。
6) 在. i d l文件里用 s t r i n g说明的字符串是以 0结尾的,如果没有在 . i d l文件里指定 s t r i n g属性,
就不要指望字符串会以 0结尾。
7) 不要将未指明长度的数据拷贝到固定长度的缓冲区中,这个错误无需更多解释。
8) size_is可能会导致一个长度为 0 的结构;在没有检查其长度之前就引用这个结构是不安全
的:在引用相应的指针前要检查s i z e _ i s指定的数据长度。
9) size_is 或l e n g t h _ i s 说明中的算术表达式可能会溢出:要知道使用 s i z e _ i s或l e n g t h _ i s 的
M I D L定义中的表达式计算可能导致溢出,而且服务器不可能检测到。
10) 严格的上下文句柄:请使用严格的上下文句柄。
5.2 常见的RPC编程错误
下面这一节详细解释R P C常见的编程错误,并指导您如何避免这些错误。
32使用第一部分 概 述
下载
5.2.1 Pointer_default (unique )和嵌套指针
当一个R P C结构里面包含指针时,指针缺省为默认类型(通常由p o i n t e r _ d e f a u l t ( u n i q u e ) 设定)。
在这种情况下,u n i q u e指针可能为N U L L ,在被引用之间必须确认为非N U L L 。
例子:
[
p o i n t e r _ d e f a u l t ( u n i q u e )
]
typedef struct _RPC_STRUCTURE {
INSTANCE_DATA *Instance;
} R P C _ S T R U C T U R E ;
N T S T A T U S
R p c I n t e r f a c e (
[in ] RPC__STR
文档评论(0)