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

news2024/9/23 1:40:10

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 程序的原始自述文件中,有一段介绍与我有关,链接回我本人…

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HackTheBox-Machines--Beep

Beep测试过程 1 信息收集 nmap端口扫描 gryphonwsdl ~ % nmap -sC -sV 10.129.137.179 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-28 14:39 CST Nmap scan report for 10.129.229.183 Host is up (0.28s latency). Not shown: 988 closed tcp ports (conn-refused…

python办公自动化——(二)替换PPT文档中图形数据-柱图

效果: 数据替换前 : 替换数据后: 实现代码 import collections.abc from pptx import Presentation from pptx.util import Cm,Pt import pyodbc import pandas as pd from pptx.chart.data import CategoryChartData…

C语言 数组—— 一维数组下标越界问题分析

目录 数组元素的访问 一维数组元素的越界访问 二维数组元素的越界访问 小结 数组元素的访问 访问数组元素时, 下标越界 是大忌!  编译器通常不检查下标越界,导致程序运行时错误  下标越界,将访问数组以外的空间  …

如何学到数据库从入门到入土(MySQL篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…

开源AI模型:未来发展的领航者!

开源AI模型简单概述 开源AI模型是指那些其源代码可以自由使用、修改和分发的人工智能模型。这些模型通常由社区成员共同开发,并且可以在遵守相应许可证的前提下被任何人用于商业或研究目的。开源AI模型的出现极大地推动了人工智能技术的发展,使得更多的…

uniapp - 文章模块页面

在上一篇文章中,创建了一个空白的文章模块页面。在这一篇文章,让我们来向页面中填充内容。 目录 页面效果涉及uniapp组件1.view2.swiper3.scroll-view4.属性解读1) class"style1 style2 .."2) circular单属性无赋值3) :autoplay"autoplay…

gitlab将本地文件项目上传至gitlab服务

打开gitlab网页界面,登陆管理员账号 (测试服务器安装的gitlab,浏览器输入ip或配置的gitlab地址) 创建新项目 使用gitlab创建项目 创建一个新项目(忽略分组) (忽略分组) 在创建工…

网络原理-------TCP协议

文章目录 TCP协议TCP协议段格式TCP原理确认应答机制 (安全机制)超时重传机制 (安全机制)连接管理机制 (安全机制)滑动窗口 (效率机制)流量控制 (安全机制)拥塞控制 (安全机制)延迟应答 (效率机制)捎带应答 (效率机制) 基于TCP的应用层协议 TCP协议 TCP, 即 Transmission Contr…

鸿蒙OS开发:【一次开发,多端部署】(导航栏) 导航栏

一多导航栏 介绍 本示例展示了导航组件在不同设备形态下的样式。 在sm设备上,以tabs形式展示,内容、导航为上下样式布局,通过点击底部tabs切换内容;在md/lg设备上,以[SideBarContainer]形式展示,内容、导…

OZON平台支持什么ERP,芒果店长ERP

随着跨境电商行业的飞速发展,越来越多的电商平台与ERP系统展开了紧密的合作,旨在通过技术整合提升商家的运营效率和市场竞争力。在众多电商平台中,OZON以其独特的商业模式和强大的市场影响力,吸引了众多商家的目光。而芒果店长ERP…

Linux基础知识,配置网卡(七)

一、简介 1. 虚拟机的网络设置 目的1:让物理机和虚拟机之间可以互相通信 目的2:让虚拟机可以上网 目的3:让虚拟机之间可以互相通信 2.网络的类别 类别1:实现物理机和虚拟机之间通信 物理机只要安装了vmware之后,就会…

“SSH服务器拒绝了密码,请再试一次”的问题解决思路

大家在使用XShell工具连接Ubuntu系统时,可能会出现错误如下: 通过在网上查阅资料和实践解决这个问题,将我的思路分享给大家! 首先,我会先从使用Xshell连接远程服务器会涉及哪些东西上思考这个问题,即通过ssh服务连接远…

2024年5月软考成绩什么时候出?附查询方式

2024年5月软考成绩查询时间及查询方式: 查询时间:预计在2024年7月上旬进行。 查询方式: 方式一:登陆中国计算机技术职业资格网(www.ruankao.org.cn),点击报名系统,输入注册账号和…

ResNet论文解读—Residual Learning Deep for lmage Recognition(2016)

ResNet论文解读—Residual Learning Deep for lmage Recognition(2016) 研究背景 图像识别中的深度残差学习网络(MSRA:微软亚洲研究院) 认识数据集:ImageNet的大规模图像识别挑战赛 LSVRC-2015:ImageNet Large Scale Visual Rec…

Android 中资源文件夹RES/RAW和ASSETS的使用区别

文章目录 1、res/raw 文件夹1.1、特点1.2、使用方法1.3、示例: 2. assets 文件夹2.1、特点2.2、使用方法2.3、示例: 3、使用场景3.1、res/raw 使用场景3.2、assets 使用场景 4、比较与选择5、文件夹选择的建议6、 示例代码总结6.1、res/raw 示例6.2、ass…

Raven2掠夺者2渡鸦2账号需要验证怎么解决 超简单验证账号教程

《渡鸦2》是一款源自韩国的创新力作,作为《Raven》系列的最新续篇,这款游戏在MMORPG手游领域内再度扩展了其标志性的暗黑奇幻宇宙,融入了大量革新的游戏设计与丰富内容。定档于2024年5月29日开启公测的《渡鸦2》,正处在紧张刺激的…

2024年物理化学与工程技术发展国际会议(ICPCETD 2024)

全称:2024年物理化学与工程技术发展国际会议(ICPCETD 2024) 会议网址:http://www.icpcetd.com 会议时间: 2024.06.30 截稿时间:2024.06.21 会议地点: 上海 投稿邮箱:icpcetd_info163.com 投稿标题:ArticleT…

【UE C++】 虚幻引擎C++开发需要掌握的C++和U++的基础知识有哪些?

目录 0 引言1 关键的 C 知识2 Unreal Engine 相关知识3 学习建议 🙋‍♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏💥 标题:【UE C】 虚幻引擎C开发需要掌握的C和U的基础知识有哪些?❣️ 寄语&…

代码随想录算法训练营第五十三天||1143.最长公共子序列、1035.不相交的线、53. 最大子序和

文章目录 一、1143.最长公共子序列 思路 二、1035.不相交的线 思路 三.53. 最大子序和 思路 一、1143.最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原…

VPN的详细理解

VPN(Virtual Private Network,虚拟私人网络)是一种在公共网络上建立加密通道的技术,通过这种技术可以使远程用户访问公司内部网络资源时,实现安全的连接和数据传输。以下是对VPN的详细介绍: 选择代理浏览器…