繁体   English   中英

.NET中平台调用中使用的命名约定

[英]Naming conventions used in Platform Invocation in .NET

我一直在使用Microsoft P / Invoke Interop Assistant工具从本地C / C ++代码生成某些结构,委托等。

其中一个示例是函数指针(委托),它在托管代码中解析为以下名称:

EnumCalendarInfoProcA
EnumCalendarInfoProcW
EnumCalendarInfoProcExA
EnumCalendarInfoProcExW

谁能解释A和W与ExA和ExW之间的区别?

某些功能具有几种格式。 ASCII(MessageBoxA)或宽字符/ Unicode(MessageBoxW)。 当函数执行相同的操作(但更多)时,该名称通常得到后缀'Ex',并且可能意味着扩展。

像下面的功能

消息框: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/ms645505( v=vs.85) .aspx

MessageBoxEx: http : //msdn.microsoft.com/zh-CN/library/windows/desktop/ms645507( v=vs.85) .aspx

其中MessageBoxEx由参数wLanguageId扩展。

您必须对PInvoke Interop Assistant保持谨慎。 它生成的声明是完全自动生成且未经编辑的。 结果,它往往会产生相当尴尬的结果,您至少需要与经过编辑的声明来源进行比较,例如可从pinvoke.net网站和MSDN库获得的声明。

存在A和W版本是因为该函数操纵字符串。 Windows 9x分支中的旧版本未启用Unicode。 他们使用了A版本,即带有8位编码字符的字符串。 这与Windows ME的迅速而当之无愧的淘汰不再相关。 您今天将遇到的所有Windows版本都来自NT分支,并且它们的核心已启用Unicode。

基于[DllImport]属性中的CharSet属性,pinvoke编组器已经知道如何在A版本和W版本之间进行正确选择。 遗憾的是,默认值仍然是Ansi,这是一个大错误,您应该始终指定CharSet.Auto并使用不带W的名称。确切的名称实际上对EnumCalendarInfoProc并不重要,因为它是回调原型,因此您将其声明为委托。 您可以选择任何名称。

在MSDN文章中很好地解释了EnumCalendarInfoProc和EnumCalendarInfoProcEx之间的区别,Ex版本有一个额外的参数。 您需要使用哪一个取决于您用来开始枚举的api函数。 选择EnumCalendarInfo()或EnumCalendarInfoEx()。 后者很有意义。 并注意在Vista或更高版本上可用的ExEx版本。 文化的变化比微软创建Exes的能力快;)

在委托和函数声明上都应用CharSet.Auto。

暂无
暂无

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

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