使用 CreateWindowEx 调用的 WindowProc 函数中的 lParam 参数中的 CREATESTRUCT 对象会导致有关 lpCreateParams 元素位置的奇怪行为。
CREATESTRUCT* pCreate = (CREATESTRUCT*) lParam;
printf("%lld ", ((size_t)pCreate->lpCreateParams) - (size_t)pCreate);
//1712 on my machine
基于 windowsAPI reference,lpCreateParams 应该是结构体的第一个元素,因此应该相当于结构体指针。这是否意味着 CREATESTRUCT 根据平台有不同的实现?
编辑:我正在使用 gcc 版本 13.2.0(x86_64-win32-seh-rev1,由 MinGW-Builds 项目构建)并使用
gcc -g -municode --all-warnings -O3 file.c -lpthread -o file -lgdi32
进行编译
正如@JonathanPotter在评论中指出的,lParam->lpCreateParams本身就是一个指针值,因此需要使用&lParam->lpCreateParams来获取它的地址(它在结构中的位置)。
((size_t)&pCreate->lpCreateParams) - (size_t)pCreate)
返回预期结果。