C++ NET平台调用中使用的命名约定
我一直在使用Microsoft p/Invoke Interop Assistant工具从本机C/C++代码生成一些结构、委托等 其中一个示例是函数指针(委托),它在托管代码中解析为以下名称:C++ NET平台调用中使用的命名约定,c++,.net,native,platform,language-interoperability,C++,.net,Native,Platform,Language Interoperability,我一直在使用Microsoft p/Invoke Interop Assistant工具从本机C/C++代码生成一些结构、委托等 其中一个示例是函数指针(委托),它在托管代码中解析为以下名称: EnumCalendarInfoProcA EnumCalendarInfoProcW EnumCalendarInfoProcExA EnumCalendarInfoProcExW 有人能解释A和W以及ExA和ExW之间的区别吗?有些函数有几种格式。Ascii(MessageBoxA)或宽字符/uni
EnumCalendarInfoProcA
EnumCalendarInfoProcW
EnumCalendarInfoProcExA
EnumCalendarInfoProcExW
有人能解释A和W以及ExA和ExW之间的区别吗?有些函数有几种格式。Ascii(MessageBoxA)或宽字符/unicode(MessageBoxW)。 当一个函数做同样的事情,但更多的时候,这个名字通常会有一个后缀“Ex”,并且可能意味着扩展 类似于以下函数 MessageBox: MessageBoxEx:
其中MessageBoxEx由参数wLanguageId扩展。某些函数具有多种格式。Ascii(MessageBoxA)或宽字符/unicode(MessageBoxW)。 当一个函数做同样的事情,但更多的时候,这个名字通常会有一个后缀“Ex”,并且可能意味着扩展 类似于以下函数 MessageBox: MessageBoxEx:
其中MessageBoxEx由参数wLanguageId扩展。使用PInvoke互操作助手时必须小心一点。它生成的声明是完全自动生成和未编辑的。它往往会产生相当尴尬的结果,因此,您至少需要与已编辑的声明源进行比较,如pinvoke.net网站和MSDN库中提供的声明源 A和W版本的存在是因为函数操作字符串。9x分支中的旧版本Windows未启用Unicode。他们使用的是A版本,字符串带有8位编码字符。这与Windows ME当之无愧的迅速消亡不再相关。您今天遇到的所有Windows版本都来自NT分支,它们的核心都支持Unicode pinvoke marshaller已经知道如何根据[DllImport]属性中的字符集属性在A和W版本之间进行正确选择。遗憾的是,默认值仍然是Ansi,这是一个很大的错误,您应该始终指定CharSet.Auto并使用不带W的名称。确切的名称对于EnumCalendarInfoProc实际上并不重要,因为它是回调原型,您可以将其声明为委托。你可以选择任何名字 EnumCalendarInfoProc和EnumCalendarInfoProcEx之间的区别在MSDN文章中有很好的解释,Ex版本有一个额外的参数。需要使用哪一个由开始枚举时使用的api函数决定。选择EnumCalendarInfo()或EnumCalendarInfoEx()。后者是有道理的。请注意在Vista和更高版本上提供的ExEx版本。文化变化的速度快于Microsoft创建前任的能力;)
在委托和函数声明上应用CharSet.Auto。使用PInvoke互操作助手时必须小心一点。它生成的声明是完全自动生成和未编辑的。它往往会产生相当尴尬的结果,因此,您至少需要与已编辑的声明源进行比较,如pinvoke.net网站和MSDN库中提供的声明源 A和W版本的存在是因为函数操作字符串。9x分支中的旧版本Windows未启用Unicode。他们使用的是A版本,字符串带有8位编码字符。这与Windows ME当之无愧的迅速消亡不再相关。您今天遇到的所有Windows版本都来自NT分支,它们的核心都支持Unicode pinvoke marshaller已经知道如何根据[DllImport]属性中的字符集属性在A和W版本之间进行正确选择。遗憾的是,默认值仍然是Ansi,这是一个很大的错误,您应该始终指定CharSet.Auto并使用不带W的名称。确切的名称对于EnumCalendarInfoProc实际上并不重要,因为它是回调原型,您可以将其声明为委托。你可以选择任何名字 EnumCalendarInfoProc和EnumCalendarInfoProcEx之间的区别在MSDN文章中有很好的解释,Ex版本有一个额外的参数。需要使用哪一个由开始枚举时使用的api函数决定。选择EnumCalendarInfo()或EnumCalendarInfoEx()。后者是有道理的。请注意在Vista和更高版本上提供的ExEx版本。文化变化的速度快于Microsoft创建前任的能力;)
在委托和函数声明上应用CharSet.Auto。A代表
ANSI
,在Microsoft speak中表示“本地遗留编码”,而不是实际的ANSI编码。@code它指的是编码,可能与OEM/DOS代码页相反。从这个角度来看,ANSI确实仍然是错误的,但在我看来,它比你认为的要准确得多。感谢ANSI的澄清!A
代表ANSI
,在Microsoft speak中表示“本地传统编码”,并不指实际的ANSI编码。@code它指的是一种编码,可能与OEM/DOS代码页相反。从这个角度来看,ANSI确实仍然是错误的,但在我看来,它比你认为的要准确得多。感谢ANSI的澄清!