delphi CreateWindowEx()返回0

qojgxg4l  于 2023-04-20  发布在  其他
关注(0)|答案(1)|浏览(122)

我知道有很多关于我的问题的帖子,我也读了这篇文章Delphi 11.2: CreateWindowEx fails thread on x64,但我不明白我到底应该做些什么来克服这个问题.我在Cromis工作.DirectoryMonitoring Cromis.Utils.pas https://github.com/CPsoftBE/BackupOfCromis,下面的代码CreateWindowEx()返回0只为 Delphi 11.2 /64位.

Result := CreateWindowEx(WS_EX_TOOLWINDOW, CTSHiddenWindowName, '', WS_POPUP,0, 0, 0, 0, 0, 0, HInstance, nil);
wixjitnu

wixjitnu1#

我在Cromis.Utils.pas中看到的一个问题是,TSClassWndProc()的声明对于64位构建是错误的。它声明如下:

function TSClassWndProc(Window: HWND; Message, WParam, LParam: longint): longint; stdcall;

Longint是错误的类型。函数应该这样声明:

function TSClassWndProc(Window: HWND; Message: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;

WPARAMLPARAMLRESULT的大小在32位和64位版本之间变化。使用错误的类型可能会导致 * 未定义的行为 *。
顺便说一句,没有必要使用{$IFDEF}来基于构建目标有条件地调用(Get|Set)WindowLongPtr()(Get|Set)WindowLong()(Get|Set)WindowLongPtr()在32位和64位构建中都可以工作,所以无条件地使用它们。

相关问题