How do my .NET-based clients get the app's HINSTANCE to pass to my function?

DevCAI SimpleButton / CheckButton 按钮实现分析 分析对象:DevCAI 自研的与(对应第 2.3 节“选项、按钮与状态”中同名组件)(2286 行,单文件承载整个按钮家族)分析日期:2026-11-05技术栈:VS2022 / .NET Framework 4.8.1 / C# 8.0(库代码语法不高于 C# 7.3) 阅读详情

Q I'm in the process of converting an existing C++ class library to the Managed Extensions so I can expose it to my .NET Framework-based clients. Some of my code calls API functions that require the HINSTANCE of the current running module. I don't want to use the HINSTANCE of my DLL; I want the caller to supply the HINSTANCE of the EXE calling my DLL. I can declare the HINSTANCE parameter as an IntPtr, but how do my .NET-based clients get the app's HINSTANCE to pass to my function? For example, how would they do it in C#?

Hunter Gerson

A Good question! This one stumped me for about 15 minutes. In MFC you can call AfxGetInstanceHandle(). MFC stores the HINSTANCE in its Application object, in CWinApp::m_hInstance. So if you're using the Microsoft® .NET Framework, you might think that you should take a look in the Application object for Application.HInstance or an Application property or some such thing. Why not? Because it's not there!

If you search the Framework documentation for "hinstance," you'll discover there's a method Marshal.GetHINSTANCE. Well, that sounds promising. This static Marshal method requires the module whose HINSTANCE you want to obtain:

// In C#
Module m;
...
IntPtr h = Marshal.GetHINSTANCE(m);

Now you know how to get the HINSTANCE—but where do you get the module? Again, you might think to look in the Application class for something like Application.GetModule. Or perhaps Application is derived from module, that would make sense. Alas, neither is true. Well, maybe there's a Module property. Nope. Well, not quite. There is a Module property, but it's not a property of the Application, it's a Type property. In the .NET Framework, every object has a Type and every Type has a Module. Type.Module represents whichever module implements the type. So to get the HINSTANCE of the calling module, your clients can write:

Type t = myObj.GetType();
Module m = t.Module;
IntPtr h = Marshal.GetHINSTANCE(m);

You can also use typeof (--typeof in C++)to get the type without an object instance, as in typeof(MyApp). Just tell your customers to make sure they use a type that's implemented in the calling module. If you use some other type—for example, one of the Framework types like String—you'll get the wrong module.

Figure 1 shows a simple C# console app, ShowModule, that illustrates this. Figure 2 shows it running. ShowModule displays module information including the HINSTANCE for two types: the MyApp class defined in the application itself and the String[] (String array) type defined in mscorlib.

Figure 2 Module Information
Figure 2  Module Information
核心原理:借助微软原生 **UIA(UI Automation)无障碍树** 做自动化 不是截图对比、不是坐标点击;Windows 应用向外暴露一棵NameIsEnabledIsVisible、Value、Selection 等,自动化框架读取这棵树定位控件、调用控件模式(Invoke、Value、Selection 等)进行操作和校验Microsoft ...。✅ 优点:不受分辨率、DPI 缩放、窗口位置影响,稳定性远高于图像识别;❌ 前提:应用控件;DirectUI、Canvas 自研绘制控件、部分 Electron 打包程序可能不暴露 UIA,这时才降级图像 / OCR 兜底。 阅读详情

相关推荐

应用程序向导

应用程序向导  何志丹            使用应用程序向导可以快速生成程序框架。选择菜单“File→New”命令,此时会弹出“New”对话框,下面对该对话框中的常用选项进行逐一说明。1.文件(Files)属性页 单击“Files”标签,打开“Files”属性页,如图1-3所示。图1-3  文件属性页文件类型虽然多,但常用的只有两种:C/C++ Header Fi

闻缺陷则喜何志丹 3654

大麦无线虚拟服务器,大麦路由器192.168.10.1设置教程

问:大麦路由器通过192.168.10.1怎么设置才可以正常上网?大麦路由器192.168.10.1登录入口不知道怎么打开登录设置了,求详细设置步骤。答:大麦无线路由器有不少的型号,从硬件规格上来讲有百兆和千兆的无线路由器,在本文家用路由器网以千兆款的路由器为例,来分享相关的设置教程。准备工具:大麦DW33D一台智能手机或电脑一部以下为视频版设置教程,可以参考:1、大麦千兆路由线路连接入户网络(光...

weixin_35985162的博客 1万+

ENU坐标系实战:5分钟搞定无人机导航中的站心坐标转换

本文针对无人机导航中GPS坐标与视觉感知不匹配的定位漂移问题,提供了基于ENU坐标系的实战解决方案。通过Python代码演示了如何快速、精准地实现地心地固坐标与站心坐标之间的转换,并详细解释了转换原理、精度对比及工程优化技巧,帮助开发者从根本上解决局部相对定位不准的难题。

mqtt6iot的博客 552

微软技术日报 2026-11-05:安装器变现链被拆开、OneLake 托管 MCP、Agent 365 进 Gartner 象限

把这几条放在一起看,共同点是把已经铺开的东西补上治理。安装器那条最直白。用户自己点开的程序,装完还会往回连,落地的东西藏在计划任务里、Program Files 里,用户不知道。微软给的检测思路也是往这个方向走的,看临时目录、看回调、看 SYSTEM 任务,而不是追域名。OneLake 那条是给 agent 补路标。以前每种 item 类型都要维护一份端点清单,现在让服务自己报出来。好处是 agent 不用猜,代价是判断责任转移到了客户端,技能要不要加载得自己决定,标签也不能当成授权。

海盗Sharp的博客 1293

科研绘图实战:用Adobe Illustrator高效排版期刊论文图片

本文详细介绍了使用Adobe Illustrator高效排版科研论文图片的完整工作流。针对期刊投稿常见的图片格式问题,文章重点讲解了矢量图与位图的预处理、AI中的精准对齐与分布技巧、文字样式统一管理以及最终输出TIFF/PDF等符合出版要求的格式。掌握这套方法能确保图片满足高分辨率、规范字体和精确尺寸等期刊硬性标准,显著提升投稿效率。

tomato的博客 1426

S4HANA - Cost Elements成本要素

SAP这里面的配置逻辑很像,就是先建一个对象,然后不停给这个对象附加一些属性,给一个账户附加编号范围,附加账户组。所有模块的维度都在这个表里,看下图的GL,CO,COPA,AA,ML的都在ACDOCA里。要把这5个类型和六大要素对应,先得把六大要素和账户类型对应下(以下是个人理解,不知道对错):当然那个C是新来的,我觉得放在资产下面也行,就不画图了。S4的嵌入式分析是在业务逻辑都整套嵌入的情况下,预开发了数据模型,所以它能提供的就不仅是原始数据了,它能提供的是包含所有相关联的上下文的信息数据。

weixin_45689053的博客 2393

微软常用运行库合集免费下载安装教程(附运行库安装包)微软运行库安装图文教程

系统装完后出现“丢失xxx.dll”错误,多因缺少微软运行库所致。微软常用运行库合集将2005至2022年主流版本打包,一键安装,覆盖绝大多数软件依赖。无需判断版本,全选安装即可,装完建议重启。该合集可重复安装,不冲突,且与系统自带组件共存。适用于刚装系统的用户,能有效解决软件打不开、闪退等问题。

kk_net8899的博客 151

22、硬件工程师笔试面试——电机(2025版本)

例如,B级绝缘的电机可以承受的最高温度为130℃,而H级绝缘的电机可以承受高达180℃的温度。同时,也要考虑电机的成本和控制系统的复杂性。电机的选择取决于其应用的具体要求,包括所需的功率、速度、扭矩、效率、成本和工作环境等。根据电动机保护配置原则,为电机配置适当的保护,如过负荷保护、缺相保护、逆相保护、接地漏电保护、堵转保护、相不平衡保护、短路保护、过电压保护、低电压保护、过热保护等。根据安培环路定理,电流和磁场的相互作用会在电机的转子上产生力,这些力作用于转子上,使其绕轴旋转,从而产生转矩。

XU157303764的博客 3537

让 AI 查订单、查库存、发消息:Spring AI 自定义工具(Tool)实战与工具描述工程

本文详解Spring AI 2.0中如何将Spring Bean方法通过@Tool注解暴露为AI可调用工具,核心在于“描述工程”——工具名需见名知义,描述要具体清晰,参数须注明格式与范围。强调错误应返回结果而非抛异常,敏感操作需人工兜底。针对海量工具场景,推荐使用检索式注册。结合实战案例与踩坑指南,提供从注册、描述到容错的完整方法论,助力高效构建可信赖的AI工具链。

weixin_43128865的博客 292

YOLOv8 交通违规检测各个场景的实际应用

本文介绍了基于YOLOv8的交通违规检测系统在不同场景下的应用实现。系统可检测闯红灯、超速、违停和不系安全带等多种违规行为,针对每种场景提供了具体的技术方案和Python实现代码。其中闯红灯检测结合信号灯状态分析,超速检测通过距离时间计算速度,违停检测采用长时间跟踪策略,安全带检测则需更高精度识别。文章还展示了如何整合各功能构建综合交通监管系统,并总结了不同应用场景的技术要点和优化方向,为智能交通管理提供了实用解决方案。

u010117029的博客 299

网络工程师如何利用Python自动Telnet到N个路由器并执行配置?

telnetlib是Python标准库中的一个模块,专门用于实现Telnet协议。通过telnetlib,我们可以方便地与支持Telnet协议的远程设备进行通信。telnetlib提供了基本的Telnet功能,如连接远程主机、发送命令、读取响应等,使得编写Telnet自动化脚本变得非常简单。文档:可以选择中文:虽然telnetlib的功能相对基础,但对于大多数Telnet操作来说已经足够。通过telnetlib,可以轻松地实现与网络设备的交互,完成自动化配置任务。

网络技术联盟站 298

【测评】SenseNova6.8Flash模型正式发布,支持动态 PPT 及 3D 设计

SenseNova 6.8 Flash将设计生成拓展至多种创作形态,支持Web、SVG、Three.js、Blender、PPT等形式,满足多样化的AI Native Design需求,并支持动态PPT、动态Poster与Agentic 3D设计。同时,模型可接入Figma等专业工作流,帮助用户将AI设计能力融入现有的专业设计流程。此外,模型还支持三维场景与交互内容创作,可综合处理空间布局、材质与光照、镜头控制及动画编排等因素,构建可在网页中实时渲染的三维内容,拓展从立体视觉展示到动态交互的表达方式。

Enweitech Software Works 289

SAP_SD模块更改销售订单定价简介

方式优点缺点适用场景MASS简单,无需开发不能触发重新定价逻辑修改特定字段BDC (VA02)可模拟人工操作维护复杂,速度慢少量订单批改稳定、安全需ABAP支持推荐用于批量重新定价VBOF标准重算返利仅适返利类条件返利更新通过本文,我们了解了 SAP 的[SAP_SD模块更改销售订单定价]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。更多SAP文章请点击更多SAP文章更新,大家一起学习进步!!!

我小时候很黑的博客 706

微软推出 dotnetup:多版本管理更省心~

这是一个官方出品的.NET 工具链管理器,目前处于公共预览阶段,定位类似 Rust 生态中的 rustup。‌‌。

Enweitech Software Works 358

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

在上一篇中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂载失败,这是因为我们还没有根文件系统,在本章中,我们将制作根文件系统。rootfs制作方式有很多方式,如busyBoxbuildrootYocto等,在该篇章中,我们使用buildroot来制作根文件系统,主要考虑到busyBox制作完还需要手动首改一些启动配置比较繁琐,而Yocto如果电脑配置不是很好,编译时间过长,比较麻烦。

sinat_33909696的博客 2464

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

微软技术日报 2026-11-03:冒牌 Claude Code 扩展留后门、Fabric 数据工程 agent 进预览、Access IE 控件定退场

微软安全博客在 10 月 30 日复盘了一起扩展市场供应链事件:一个冒用 Anthropic 名字的 Cursor 扩展,在被下架之前挂了约 11 个小时。它做的事情不复杂,装完之后在你机器上开一条反向 SSH 隧道,留三处开机自启,再把主机信息发回一台固定 IP 的服务器。同一天前后,微软在 Fabric 社区大会巴塞罗那站把数据工程 agent(Project Osmos)放进了公共预览,在乌镇拿了一个奖,Access 团队则给一个用了二十年的浏览器控件定了退场日期。

海盗Sharp的博客 397

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

视频美颜sdk的API设计会影响开发效率吗?

视频美颜SDK不仅需要具备优秀的图像处理能力,API接口设计同样会影响软件开发效率。本文从接口调用、参数配置、版本兼容、开发文档以及业务扩展等多个角度,分析API设计对视频美颜SDK集成和后期维护的实际影响,为直播APP、视频社交平台等项目的SDK选型与技术开发提供参考。

wanyuekeji的博客 193

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

微软技术日报 2026-11-04:8GB 专属优化、38 万漏洞利用统计、NuGet 包带技能

11 月的第一周,微软把注意力放回了最不显眼的那批机器。11 月 3 日,Windows 官方博客发出一篇由 Pavan Davuluri 署名的文章。他是微软执行副总裁,负责 Windows 与设备。文章的题目直白得少见,讲的是怎么把 8GB 内存的 Windows 11 电脑拉到及格线以上。同一天,.NET 博客在讲另一件事,怎么把 agent skills 塞进 NuGet 包。11 月 2 日,微软安全研究发了一份跨 27 年的漏洞利用统计。

海盗Sharp的博客 414

微软技术日报 2026-11-06:本地服务器补丁将自动安装、画图 8.1 分漏洞修复卡在商店、DACS 开源

今天这四条,能拼出一条共同的线:默认值在往自动那一侧挪。补丁从等人装改成到期自动装,紧急缓解从需要开启改成默认开启。智能体的权限从长期持有改成按任务发、按风险收,普通用户的提权从整块管理员切成改一个网络设置这样的单点。这条线有同一个前提,策略得先写对。自动装补丁的前提是你能接受某天早上服务器自己重启;按任务发权限的前提是任务边界描述得足够清楚。默认值变聪明,不等于判断变简单。还有一条更细的教训来自画图那个漏洞。修复版本发布在商店里,公告写着需要客户操作,但商店里那几天没有可装的东西。

海盗Sharp的博客 516

【AI智能体】Langchain 上下文记忆使用实战操作详解

【AI智能体】Langchain 上下文记忆使用实战操作详解

congge_study的博客 248

微软技术日报 2026-11-01:语言模型 API 免申请、8 个威胁组织被分四档

从这里开始,五分钟看完微软技术圈一夜之间的变化。

海盗Sharp的博客 208

Gemini 语音混音入门:在 AI Studio 用文字调整音色和口音

说明在 Google AI Studio 基于已有音色用自然语言做 Voice remixing:选择基础音色、输入相对调整、试听预览并保存为独立 voice ID,再用混音后的声音合成旁白。

死磕音视频 153

设置ODBC的自定义类CSetODBC

何志丹一,功能描述用于配置数据源用户名及密码.1,可以得到连接串,此串可用于CMyRecordset(派生于CRecordset)的GetDefaultConnect(),也可以用干CDataBase类OpenEx.2,如果用户配置正确,只需要配置一次,相关信息记录在文件.3,可以指定存储信息的文件名.因为有可能几个程序共用一个数据源.4,用户可以重新配置数据5,可以得到当前数据的类型.6

闻缺陷则喜何志丹 3099

Qt窗口:对话框:模态、非模态、混合属性;内置对话框:消息、颜色、文件、字体、输入

对话框:模态exec、非模态show、混合属性setModal(true)+show;内置对话框:消息QMessageBox、颜色QColorDialog、文件QFileDialog、字体QFontDialog、输入QInputDialog

Wangshijie1015的博客 235
上一篇: 获得当前Windows操作系统版本的详细描述信息
下一篇: C#中调用Windows API的要点
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值