翻译《The Old New Thing》- What did MakeProcInstance do?

What did MakeProcInstance do? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20080207-00/?p=23533

Raymond Chen 2008年02月07日


 MakeProcInstance 做了什么?

      MakeProcInstance 宏实际上什么也不做。

#define MakeProcInstance(lpProc,hInstance) (lpProc)

        一个什么也不做的宏有什么意义呢?

        在16位Windows系统中,MakeProcInstance 是有作用的。

        回想一下,在16位Windows系统中,HINSTANCE 是用来标识数据段的机制;也就是说,是代表模块使用中的变量集合的一块内存。如果你运行了两个记事本的副本,代码只有一个副本,但变量有两套(每份副本一套)。正是这第二套变量建立了记事本的第二个副本。

        当你设置一个回调函数,比如窗口过程时,回调函数需要知道它被调用是为了哪一套变量。例如,如果一个记事本副本调用 EnumFonts 并传递一个回调函数,这个函数需要知道它正在哪个记事本副本中运行,以便它可以访问正确的变量集合。这就是 MakeProcInstance 函数的作用。

  MakeProcInstance 的参数是一个函数指针和一个实例句柄。MakeProcInstance 函数会即时生成代码,将数据段寄存器设置为实例句柄,然后跳转到原始函数指针。MakeProcInstance 的返回值是指向那个动态生成的代码片段(称为 thunk)的指针,并且你在使用该代码片段作为函数指针时,需要其他函数回调你。这样,当你的函数被调用时,它的变量就会正确设置。

        当你不再需要代码片段时,你可以使用 FreeProcInstance 函数释放它。

        那些使用过ATL的人已经在 CStdCallThunk 类中看到过这种代码片段生成。操作与 MakeProcInstance 完全类似。你使用函数指针和 this 参数初始化 CStdCallThunk,它即时生成代码,通过在调用你初始化thunk时使用的函数之前设置 this 指针,将静态函数转换为 C++ 成员函数。

        在16位Windows上创建这些代码片段必须由内核完成,因为8086处理器没有内存管理单元。没有通过转换表的间接寻址;所有地址都是物理的。因此,如果内存管理器需要移动内存,它还必须知道所有移动内存的引用位置,以便可以更新指针。如果数据段移动了,内核必须去修复所有的 MakeProcInstance thunks,以便它们使用新的实例句柄而不是旧的。

        是 Michael Geary 发现所有这些 MakeProcInstance 工作是不必要的。如果回调函数位于DLL中,那么函数可以硬编码其实例句柄,并在函数开始时加载它;这种技术最终被称为 loadds。由于DLL是单实例的,DLL已经知道它应该使用哪一套变量,因为从一开始就只有一套DLL变量!

当然,硬编码的值必须作为修正记录,因为实例句柄是在运行时确定的。另外,内核需要知道如果实例句柄的值改变,需要更新哪些值。

        另一方面,如果回调函数位于可执行文件中,那么它可以从堆栈选择器中获取其实例句柄;这种技术最终被称为 export。每个程序在一个堆栈上运行(这里没有多线程),堆栈、数据段和本地堆都按照惯例位于同一个选择器中。

        在我写这篇回忆录时,我发现了一个奇怪的回环,Michael Geary 的 FixDS 程序的原始自述文件中,有一段介绍与我有关,链接回我本人…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/656678.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四川农业大学Java实训项目圆满收官,汇智知了堂引领学子实践创新

近日,四川农业大学与汇智知了堂共同举办的Java实训项目正式迎来了项目汇报阶段。本次实训是汇智知了堂在高等教育领域深化校企合作、推动产教融合的一次重要实践,旨在为广大学子提供一个将理论知识与实际操作相结合的平台。 在实训过程中,汇…

(三)MySQL 索引

欢迎访问 什么是索引? 提高查询效率的一种数据结构,索引是数据的目录 索引的分类 按「数据结构」分类:Btree索引、Hash索引、Full-text索引。按「物理存储」分类:聚簇索引、二级索引。按「字段特性」分类:主键索引…

【Linux学习】进程间通信 (3) —— System V (1)

下面是有关进程通信中 System V 的相关介绍,希望对你有所帮助! 小海编程心语录-CSDN博客 目录 1. System V IPC 1. 消息队列 msg 消息队列的使用方法 1.1 消息队列的创建 1.2 向消息队列发送消息 1.3 从消息队列接收消息 1.4 使用msgctl函数显式地…

拉格朗日插值及牛顿差商方法的实现(Matlab)

一、问题描述 拉格朗日插值及牛顿差商方法的实现。 二、实验目的 掌握拉格朗日插值和牛顿差商方法的原理,能够编写代码实现两种方法;能够分析多项式插值中的误差。 三、实验内容及要求 利用拉格朗日插值及牛顿差商方法估计1980 年的人口,并…

监控员工电脑的软件有哪些,不得不说这几款电脑监控软件太好用了

监控员工电脑的软件在市场上种类繁多,以下是几款备受好评的电脑监控软件,它们各自具有独特的功能和优势,选择前必须了解一下才能做成正确决定。 1.安企神: 这款软件支持7天试用测试,获取测试版请移驾 ↓↓↓ 安企神…

常见的数据分析方法

1.周期性分析法 一个指标的观察时间拉长,看它是否有周期变化规律。周期性分析常见的有两者:自然周期和生命周期。自然周期,指业务指标会随着时间自然变化,如节假日用户/业绩出现下滑、产品销售额随季节变动等;生命周期,譬如“商品生命周期”、“APP生命周期”、“用户生…

【论文阅读】Rank-DETR(NIPS‘23)

paper:https://arxiv.org/abs/2310.08854 code:https://github.com/LeapLabTHU/Rank-DETR

二叉树——基础知识详解

前言: 经过前面的学习,我们接下来要开始二叉树的学习,因二叉树有难度,为了方便讲解以及各位的理解,本节知识会分成不同的小节进行学习,在本阶段只学习初阶的二叉树(堆,二叉数基本知识…

项目9-网页聊天室3(主界面之用户信息)

1.前端页面 CSS: 如何让img里的图片自适应div,且不变形_img自适应div大小 铺满且不变形-CSDN博客 JavaScript/jQuery 如何改变一个img元素的src属性|极客教程 (geek-docs.com) 2.要求 左上角显示用户的昵称和头像. 3.后端代码 3.1 添加拦截器 3.2 注册拦截器 …

信息学奥赛初赛天天练-14-阅读程序-字符数组、唯一分解定理应用

更多资源请关注纽扣编程微信公众号 1 2019 CSP-J 阅读程序1 (程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填;除特殊说明外,判断题1.5分,选择题3分,共计40分) 1 输入的字符串只能由小写字母或大写字母组…

vue/uniapp 企业微信H5使用JS-SDK

企业微信H5需要我们使用一些SDK方法如获取外部联系人userid 获取当前外部联系人userid 使用SDK前提是如何通过config接口注入权限验证配置 使用说明 - 接口文档 - 企业微信开发者中心 当前项目是vue项目,不好直接使用 引入JS文件,但我们可以安装依赖…

python使用多种方法计算列表元素平方的技巧

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、使用列表推导式进行元素平方 二、使用map函数进行元素平方 三、循环遍历列表进行元素平…

根据Depth Quality Tool的z轴误差值确认相机是否需要进行相机内参校准

下载Depth Quality Tool深度质量验证工具 网盘链接【RealSense SDK v2.55.1】 链接:https://pan.baidu.com/s/1NrlbwNDBUL8wpWfVwbpMwA?pwd2jl0 提取码:2jl0 打开Depth Quality Tool深度质量验证工具 找一面墙作为目标,将摄像头水平对准墙…

ssm超市管理系统java超市进销存管理系统jsp项目

文章目录 超市进销存管理系统一、项目演示二、项目介绍三、系统部分功能截图四、七千字项目文档五、部分代码展示六、底部获取项目源码和七千字项目文档(9.9¥带走) 超市进销存管理系统 一、项目演示 超市进销存管理系统 二、项目介绍 角色分…

007、字符串_命令

字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且 其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其 他四种数据结构的学习奠定基础。 设置值 set key value [ex seconds] [px milliseconds] [nx|xx] 下面操作设置键…

json web token及JWT学习与探索

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案 作用: 主要是做鉴权用的登录之后存储用户信息 生成得token(令牌)如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFG…

go-zero 实战(1)

环境准备 go 版本 go version go1.22.2 linux/amd64 goctl 安装 goctl(官方建议读 go control)是 go-zero微服务框架下的代码生成工具。使用 goctl 可以显著提升开发效率,让开发人员将时间重点放在业务开发上,其功能有&#xff1a…

crossover玩游戏缺少文件怎么办 为什么游戏打开说缺失文件 crossover支持的游戏列表 CrossOver 提示 X 11 缺失怎么办?

CrossOver是一款类虚拟机软件,可以实现在Mac电脑上运行exe程序。不少Mac用户为了玩游戏,选择使用CrossOver这款软件玩Windows平台的游戏。 一、CrossOver支持的软件多吗 CrossOver是一款基于Wine的兼容工具,它可以让你在Mac或Linux上运行许多…

废品回收小程序:回收市场下的商业机遇

随着当下大众环保意识的提升,回收行业收到了大众的重视,行业快速发展。在互联网信息技术的支持下,“互联网废品回收”得到了发展,依靠各种技术搭建互联网回收平台,连接到居民与商家,让回收变得更加简单高效…

使用nvm管理node多版本(安装、卸载nvm,配置环境变量,更换npm淘宝镜像)淘宝的镜像域名更换

最近 使用nvm 管理 node 的时候发现nvm install node版本号 总是失败。 nvm install 20.12.2Error retrieving "http://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": HTTP Status 404查看原因,因为淘宝的镜像域名更换,由于 npm.taob…