Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ NET平台调用中使用的命名约定_C++_.net_Native_Platform_Language Interoperability - Fatal编程技术网

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

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

我一直在使用Microsoft p/Invoke Interop Assistant工具从本机C/C++代码生成一些结构、委托等

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

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的澄清!