【发布时间】:2012-02-20 15:22:23
【问题描述】:
我今天发现GetWindowLong(和GetWindowLongPtr)有'ANSI' (A) 和'Unicode' (W) 风格,尽管它们没有TSTR 参数。 MSDN page on GetWindowLong 仅表明存在这些变体,但未提及原因。
我可以想象它必须与CreateWindowEx(也有A/W 风格)或RegisterClass 的编码相匹配,但由于很多原因,我认为这没有意义。显然,这很重要,因为someone reported that the Unicode version may fail on XP(尽管 XP 是 NT 并且据我所知,所有 Unicode 都在幕后)。我还尝试反汇编了USER32.DLL 的32 位版本(包含GetWindowLong 的两种风格),并且基于一些明显的编码差异做了额外的工作*。
我应该选择哪个功能?
*GetWindowLong 的风格是相同的,除了它们传递给其他函数的布尔值。这个布尔值与内存结构中的标志位进行比较,我懒得使用静态代码分析来追踪。
【问题讨论】:
-
愚蠢的问题 - 为什么要关心现在在 2012 年的 ANSI 版本?
-
我可以想象两个重要的场景。一种是使用第三方提供的窗口类,他们将其注册为 ANSI 类。在幕后发生的任何
A<->W转换都可能会导致一些性能损失。另一个是您使用 ANSI 的地方,因为您根本不关心 i18n(例如,您正在编写游戏并且您的窗口无论如何都在全屏显示)。 -
我明白了。好吧,无论如何,A 函数都会在内部进行转换(对于 ANSI 应用程序)。此外,UI 代码的字符串转换性能很少成为问题。