我正在将一些 Win32 代码移植到 C#,并且遇到了几个具有相同名称并使用相同结构的函数,只是它们以 A 和 W 结尾
例如:
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("shell32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool Shell_NotifyIconA(uint dwMessage, ref NOTIFYICONDATAA lpData);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("shell32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool Shell_NotifyIconW(uint dwMessage, ref NOTIFYICONDATAW lpData);
我已经看到 C# 中的一些实现省略了函数名称和关联结构中的 A 和 W,如下所示:
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("shell32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool Shell_NotifyIcon(uint dwMessage, ref NOTIFYICONDATA lpData);
我想知道的是:
A和W代表什么?
在 C# 中,我应该同时使用 A 和 W 来实现如上所示的函数,还是省略 A 和 W 以支持单一实现是更好的做法?
“A”后缀(代表 ANSI)表示该函数适用于输入多字节字符串(可能是一些成员NOTIFYICONDATA
是字符串),而“W”(代表“Wide”)表示该函数适用于输入 Unicode 字符串。
在 Windows 中,最好尽可能使用 Unicode 字符串,因为操作系统就是这样做的内部用途。因此,如果您的项目通过传递多字节字符串来调用 Windows API,则最终将在内部发生到 Unicode 的转换(如果操作系统也可能会第二次转换回多字节)returns你是一根绳子),减慢速度。
通常,当函数的某个数据结构有两个版本时X
存在于多字节和 Unicode 字符中,它们分别被赋予名称XA
and XW
和条件别名X
被定义为根据您的项目设置(一个#ifdef
进行开关)。
我对 C# 的了解不够,无法回答问题的第二部分。
EDIT:
正如所指出的大卫赫夫南 https://stackoverflow.com/users/505088/david-heffernan,p/invoke 编组器会将名称解析为与CharSet
用在DllImport
属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)