当前位置:首页 > 科技  > 软件

为什么不能通过GetProcAddress调用CreateWindow?

来源: 责编: 时间:2023-12-08 09:13:26 300观看
导读有时候,我看到有些人在折腾这样一个问题:
“我想使用 GetProcAddress 来获取 CreateWindow 或者 ExitWindows 的调用地址,但是没有成功。为什么?”通常,他们当时是在尝试编写平台调用(P/Invoke)相关的代码,因为从底层的角

有时候,我看到有些人在折腾这样一个问题:
“我想使用 GetProcAddress 来获取 CreateWindow 或者 ExitWindows 的调用地址,但是没有成功。为什么?”
xlI28资讯网——每日最新资讯28at.com

通常,他们当时是在尝试编写平台调用(P/Invoke)相关的代码,因为从底层的角度来看,平台调用是通过 GetProcAddress 来实现的。xlI28资讯网——每日最新资讯28at.com

问题来了:为什么 GetProcAddress 不能用在这些函数上呢?xlI28资讯网——每日最新资讯28at.com

原因是:它们(CreateWindow 或 ExitWindows)并非真正的导出函数,如果你查看对应的头文件,则会看到这样的宏定义。xlI28资讯网——每日最新资讯28at.com

xlI28资讯网——每日最新资讯28at.com

事实上,CreateWindow 是一个双重宏定义,首先它会根据当前是否定义了 UNICODE 来展开为 CreateWindowA 或者 CreateWindowW。然后,这些类似于函数的宏会再次被展开为真正的导出函数 CreateWindowExA 或者 CreateWindowExW。xlI28资讯网——每日最新资讯28at.com

如果包含 winuser.h 头文件,则所有这些都由编译器自动处理,但如果出于某种原因,您希望为类似函数的宏(如 CreateWindow)使用 GetProcAddress,则必须手动展开宏以查看实际函数是什么,并将该函数名称传递给 GetProcAddress。xlI28资讯网——每日最新资讯28at.com

上述原理也适用于内联函数。这些函数无法通过 GetProcAddress 获取,因为它们根本不会导出,它们在头文件中作为源代码提供给您调用。xlI28资讯网——每日最新资讯28at.com

请注意,某些内容是真正的函数还是类似函数的宏(或内联函数)可能取决于您的目标平台。例如,GetWindowLongPtrA 在 64 位 Windows 上是真正的导出函数,但在 32 位 Windows 上,它只是一个解析为 GetWindowLongA 的宏。再举一个例子,Interlocked 系列函数在 x86 版本的 Windows 上是导出函数,但在所有其他 Windows 体系结构上是内联函数。xlI28资讯网——每日最新资讯28at.com

看起来还挺复杂的,那怎么能弄清楚这一切?方法是:研究头文件。xlI28资讯网——每日最新资讯28at.com

在头文件中,您将会看到函数是重定向宏、类似函数的宏、内联函数、内部函数还是适当的导出函数。如果你无法从头文件中弄清楚,你总是可以只编写一个程序来调用你感兴趣的函数,然后查看反汇编以查看实际生成的内容。xlI28资讯网——每日最新资讯28at.com

总结

当有不明白的地方的时候,最好的方法还是去翻阅源文件(头文件)。
请坚信:任何事情(Bug)都是有原因的。
xlI28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-39484-0.html为什么不能通过GetProcAddress调用CreateWindow?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: CSS小知识,分享14个你可能还未用上但又实用的CSS属性(上)

下一篇: EventLoop = TaskQueue + RenderQueue,你看明白了吗?

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top