gpt4 book ai didi

delphi - 从非 unicode Delphi 调用 GetStringTypeW (7)

转载 作者:行者123 更新时间:2023-12-02 01:21:15 25 4
gpt4 key购买 nike

我试图从非unicode delphi应用程序调用GetStringTypeW,无论我做什么,我都会得到ERROR_INVALID_FLAGS返回。我也找不到正在使用的该函数的任何代码示例。

我还必须重新定义函数头,因为 windows.pas 中提供的函数头错误地将第三个参数识别为 bool 值(它是 INT)

这是我对该函数的定义:

function GetStringTypeW(dwInfoType: DWORD; lpSrcStr: PWideChar; cchSrc: Integer; lpCharType: Pointer): BOOL;

(由于某种原因,该函数未定义为 stdcall。尝试将其定义为 stdcall 将导致访问冲突。)

我的电话:

var
aCharType: Array of WORD;
APassword: WideString
begin
{..}
SetLength(aCharType, Length(APassword));
if not GetStringTypeW(CT_CTYPE1, PWideChar(APassword[1]), Length(APassword), @aCharType[0]) then
RaiseLastOSError;
{..}

我得到的错误是

System Error.  Code: 1004.
Invalid flags.

我已验证 CT_CTYPE1 等于 1。

有人知道可能出了什么问题或者有使用此函数的代码示例吗?

最佳答案

Windows.pas中的声明确实是错误的,但你的更正也是错误的。您已经修复了参数类型,但需要修复调用约定。它应该是stdcall:

function GetStringTypeW(
dwInfoType: DWORD;
const lpSrcStr: PWideChar;
cchSrc: Integer;
lpCharType: PWordArray
): BOOL; stdacll;

如果没有调用约定修复,Delphi 将大部分参数放入寄存器中,但操作系统希望在堆栈上找到它们。堆栈在正确的位置不包含正确的值,因此会失败。错误的调用约定还可能导致访问冲突,因为堆栈处于不一致的状态,但由于您立即抛出自己的异常,因此可能会隐藏堆栈问题。

当您使用stdcall时,您会遇到访问冲突,因为您传递了一个字符并声明它是一个指针。操作系统尝试取消引用“指针”,但由于字符值不代表有效地址,因此失败。当您调用该函数时,对整个字符串进行类型转换,而不仅仅是一个字符:

GetStringTypeW(CT_CTYPE1, PWideChar(APassword), Length(APassword), PWordArray(aCharType))

关于delphi - 从非 unicode Delphi 调用 GetStringTypeW (7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18845554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com