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

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

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

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

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

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

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

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

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

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

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

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

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

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

总结

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

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

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

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

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

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz“难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?”这一番话,出自百合网联合创
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
  • 三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    据官方此前宣布,三星将于7月26日在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top