【发布时间】:2020-11-01 01:17:16
【问题描述】:
有人知道为什么 Delphi 10.3 中的 CharUpper 和 CharUpperW 声明与 Delphi 10.4 中的声明不同。
Delphi 10.3 中的正确声明
var
chr :WideChar;
begin
chr := WideChar(CharUpperW(PWideChar('a'))); //chr = 'A'
// chr := WideChar(CharUpperW(WideChar('a'))); //raise exeption: "access violation...
Delphi 10.4 中的正确声明
var
chr :WideChar;
begin
// chr := WideChar(CharUpperW(PWideChar('a'))); //raise exeption: "access violation...
chr := WideChar(CharUpperW(WideChar('a'))); //chr = 'A'
编辑:Remy Lebeau 对 PWideChar 的解释是正确的,但关于 Delphi 10.4 版和更早版本仍然存在差异!
Lebeau解释代码样例在10.4及更早版本编译,但函数输出不同。 10.4 之前的所有版本都得到正确的输出“A”!
var
char , chr : WideChar;
begin
chr := 'a';
char := WideChar(CharUpperW(PWideChar(chr)));
end;
此示例在 10.4 下无法正常工作,输出为随机字符。
当然...
函数CharUpperW的声明在Delphi的船版中是一样的。
LPWSTR = PWideChar;
function CharUpperW(lpsz: LPWSTR): LPWSTR; stdcall;**
编辑:在 10.4 下添加反汇编代码
umCommon.pas.114: chr := 'a';
0064C52C 66BB6100 mov bx,$0061
umCommon.pas.115: char := WideChar(CharUpperW(PWideChar(chr)));
0064C530 8D45FC lea eax,[ebp-$04]
0064C533 8BD3 mov edx,ebx
0064C535 E8EEE7DBFF call @UStrFromWChar
0064C53A 8B45FC mov eax,[ebp-$04]
0064C53D E8C2E7DBFF call @UStrToPWChar
0064C542 50 push eax
0064C543 E8809DDCFF call CharUpperW
10.3下的反汇编代码
umCommon.pas.114: chr := 'a';
0063A905 66BB6100 mov bx,$0061
umCommon.pas.115: char := WideChar(CharUpperW(PWideChar(chr)));
0063A909 0FB7C3 movzx eax,bx
0063A90C 50 push eax
0063A90D E8AAB1DDFF call CharUpperW
【问题讨论】:
-
你能比较
CharUpperW在10.3和10.4中的声明吗(单位Winapi.Windows.pas)? -
@zed CharUpperW 在 10.3 和 10.4 中的声明是一样的! LPWSTR = PWideChar;函数 CharUpperW(lpsz: LPWSTR): LPWSTR;标准调用;
-
10.4 从单个字符中生成隐藏字符串,并将指向该字符串的指针指向 CharUpperW,然后它就停止了。
标签: delphi