Shell_NotifyIconA / Shell_NotifyIconW ...有什么区别?

2024-04-07

我正在将一些 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);

我想知道的是:

  1. A和W代表什么?

  2. 在 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(使用前将#替换为@)

Shell_NotifyIconA / Shell_NotifyIconW ...有什么区别? 的相关文章

随机推荐

  • 创建网格线并允许用户打开/关闭网格线视图

    我想在我的应用程序中创建网格线方法 并允许用户打开 关闭网格视图 它不需要任何类型的触摸检测或与之相关的逻辑 只是网格线供用户查看并打开 关闭它们 显而易见的解决方案是将网格图像添加到我的视图中 并在需要时使用图像视图显示它 但这是我不能接
  • 模块声明中的 require 和 require static 有什么区别

    有什么区别requires and 需要静态模块声明中的模块语句 例如 module bar requires java compiler requires static java base A requires子句表示在编译和运行时需要所
  • os.walk 与正则表达式

    我想获取适用于我拥有的正则表达式的文件列表 我想我应该使用 os walk 但是我如何将它与正则表达式一起使用 Thanks 我不知道 stdlib 中有任何实现此功能的内容 但编码并不难 import os os path def ite
  • 卡夫卡消费者陷入(重新)加入组

    如果 kafka 版本 0 10 消费者尝试重新加入消费者组 其默认行为是什么 我正在将单个消费者用于消费者组 但似乎它在重新加入时受到了打击 每 10 分钟后 它会在消费者日志中打印以下行 2016 08 11 13 54 53 803
  • 致命错误:在 C:\\Apache Software Foundation\Apache2.2\htdocs\sample\testdb.php 中找不到类“Mongo”

    致命错误 在 C Apache 中找不到 Mongo 类 软件 Foundation Apache2 2 htdocs sample testdb php 谁能帮我解决这个问题吗 为什么会这样说呢 以下是我使用过的代码 我创建了一个名为ph
  • iOS - 无法使用 CIFilter 处理图像

    我正在尝试使用 Core Image 处理图像 我创建了 UIImage 类别来做到这一点 我已经添加了石英芯 and 核心图像项目框架 导入CoreImage CoreImage h并使用了这段代码 CIImage inputImage
  • Soap 响应,XML 格式不正确,未找到 XOP 部分,使用 WSE

    我正在使用一个 Web 服务 在该服务中我发送带有附件的请求 然后我们收到来自服务器的包含各种信息的响应 我已经在另一个问题中记录了将请求放在一起的一些问题向 SOAP 请求添加附件 https stackoverflow com ques
  • ember 中可重用对象的架构

    我正在使用 ember 构建一个管理仪表板 我想创建一个可重用的图表对象 我可以在整个应用程序中拥有多个实例 图表对象应该有一个由一些标记和一个画布元素组成的模板 在插入 DOM 后我需要其 id 以便附加实际的图表 chart js 我尝
  • 显示 ModelForms 的 django 表单验证错误

    我经常发现自己在视图中使用 ModelForm 来显示和转换视图 我在模板中显示表单没有任何问题 我的问题是 当我使用这些表单时 表单通常不会使用 is valid 方法进行验证 问题是我不知道是什么导致了验证错误 这是视图中的基本示例 d
  • 无法从程序集“Microsoft.EntityFrameworkCore”加载类型“Microsoft.EntityFrameworkCore.Metadata.Internal.IEntityMaterializer”

    我正在尝试将我的 mvc 核心应用程序连接到现有的 ms access 数据库 大致如下本指南 https learn microsoft com en us ef core get started aspnetcore existing
  • 不使用子域时通配符 SSL 证书会生成错误

    我有一个带有 mydomain com SSL 证书的网络服务器 IIS 这非常适合https anysubdomain mydomain com https anysubdomain mydomain com 但要去https mydom
  • 如何使用 jQuery 获取元素的名称?

    如何使用 jQuery 获取 HTML 元素的 name 属性 你应该使用attr name 像这样 yourid attr name 你应该使用 id 选择器 如果你使用类选择器 你会遇到问题 因为返回了一个集合
  • Flutter实现重复弹性动画

    为了实现这个动画 我写了下面的代码 但是 弹性动画在项目中不起作用 我不确定有什么问题 我想重复这个动画 import package flutter material dart void main gt runApp MaterialAp
  • 为什么 nhibernate 需要 Log4Net?

    我将使用 asp net mvc3 和 nhibernate 3 2 构建我的应用程序 我决定使用 Elmah 记录所有错误消息 我记得 nhibernate 支持 log4net 并用它来记录所有查询 如果我不关心将查询输出到日志文件 我
  • 将参数传递给 pentaho CDE 报告

    我在此报告中创建了一个 CDE 参数报告 我想通过 url 传递参数 我的 CDE 报告链接如下 http localhost 8080 pentaho content pentaho cdf dd Render solution demo
  • 如何从该函数中获取函数名称?

    如何从函数内部访问函数名称 parasitic inheritance var ns parent child function var parent new ns parent parent newFunc function return
  • 如何使用 afconvert 将 .caf 转换为 .mp3 格式? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 afconvert 命令行实用程序来转换音频文件 caf to mp3格式 我用过afconvert afconvert f
  • Android 帐户验证器编辑电子邮件 ID 凭据

    当我登录时 电子邮件受保护 cdn cgi l email protection在我的应用程序中 它使用我的电子邮件成功生成帐户 如下所示 现在我注销并使用不同的电子邮件登录 例如 电子邮件受保护 cdn cgi l email prote
  • 在 bash 中对退出代码进行 AND 运算

    我有一个 bash 脚本 它对我的 源代码运行三项检查 然后exit 0如果所有命令都成功 或者exit 1如果其中任何一个失败 bin bash test1 src test 1 option exit 1 test2 src test
  • Shell_NotifyIconA / Shell_NotifyIconW ...有什么区别?

    我正在将一些 Win32 代码移植到 C 并且遇到了几个具有相同名称并使用相同结构的函数 只是它们以 A 和 W 结尾 例如 return MarshalAs UnmanagedType Bool DllImport shell32 dll