进程外COM组件的单实例化和Register-free

VB无注册调用COM组件的方法 VB使用manifest无注册调用COM组件 阅读详情

补充: 可以加入DECLARE_CLASSFACTORY_SINGLETON(xxx) 实现COM组件的单实例化

转载的这篇文章解决了Register-free问题。


之前写过一篇使用COM组件的3种方法的文章:启动COM组件的三种机制,其中后来补充了一个用免注册的方式使用进程外COM组件的方法,因为只是文字补充,没有实例,可能对于怎么实现大家不是很清楚,陆续收到一些同学的信,希望能给个例子。 所以干脆补充一篇,自己也恰好复习一下。


步骤大概是这样的:

我有一个com.exe的进程外com组件,暴露出一个ITestObject的接口。现在CustomizedWay.exe要调用这个com组件,但不希望通过注册表那一套。 虽然微软提供了registry-free的com组件机制,但目前只支持进程内COM组件(具体参考前文),但由于我们知道一个COM组件被调用的来龙去脉,我们可以跳过MS那一套,自己来完成这个工作 (如果你愿意,写一个专门针对registry-free COM的库也不是问题)。这个过程的代码为:

复制代码
  
HRESULT CreateMyRemoteHost(ITestObject ** ppResult)
{
// Get the COM Server's full path (assume they are in the same folder)
wchar_t file[MAX_PATH] = { 0 };
if ( ! GetModuleFileName(NULL, file, MAX_PATH))
return E_FAIL;
wchar_t drive[_MAX_DRIVE]
= { 0 };
wchar_t dir[_MAX_DIR]
= { 0 };
_wsplitpath_s(file, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL,
0 , NULL, 0 );
_wmakepath_s(file, MAX_PATH, drive, dir, L
" Com " , L " exe " );


// Start process (It will insert its class factory object into a global table held by OS)
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb
= sizeof (STARTUPINFO);
si.lpReserved
= NULL;
si.lpTitle
= NULL;
si.lpDesktop
= NULL;
si.dwX
= si.dwY = si.dwYSize = si.dwXSize = 0 ;
si.dwFlags
= STARTF_USESHOWWINDOW;
si.wShowWindow
= SW_HIDE;
si.lpReserved2
= NULL;
si.cbReserved2
= 0 ;
BOOL ret
= CreateProcess(file, NULL, NULL, NULL, FALSE, 0 , NULL, NULL, & si, & pi);
if ( ! ret) return E_FAIL;
WaitForInputIdle(pi.hProcess,
30000 );


// Get class factory (from class table)
CComPtr < IClassFactory > pFactory;
HRESULT hr
= CoGetClassObject(CLSID_TestObject, CLSCTX_LOCAL_SERVER, NULL, __uuidof(pFactory), reinterpret_cast < void **> ( & pFactory));
if (FAILED(hr)) return hr;

// Query interface by class factory
return pFactory -> CreateInstance(NULL, __uuidof( * ppResult), reinterpret_cast < void **> (ppResult));

}
复制代码


这个过程中有几点需要注意:

  • manifest的创建
    我们需要创建一个manifest来包含接口与tlb的信息,因为两个进程间交互的时候,COM指针是需要marshalling的,而这个是通过tlb完成的。创建tlb的命令为:
    mt.exe -tlb:com.tlb -dll:com.exe -out:com.exe.manifest
    对于产生出来的manifest,我们需要做一些修改:一是把coclass和com.exe的信息去掉,这一块我们是自己通过代码CreateProcess实现的,我们需要指定的是tlb文件和其GUID,以及其支持的所有接口(参考代码中的com.exe.manifest);二是mt.exe 产生的文件默认是单行的,为了阅读方便,需要手工换行。

  • manifest的集成
    然后我们需要将这个manifest文件嵌入到com.exe和CustomizedWay.exe中,原因是进程间通信双方都需要知道如何marshalling。如果直接使用一下命令:

    mt.exe -manifest com.exe.manifest -outputresource:com.exe 
    mt.exe -manifest com.exe.manifest -outputresource:CustomizedWay.exe
    在启动程序时,会提示找不到:ATL##.dll和MSVCR##.dll,原因在于此处会把默认的manifest内容覆盖掉,而那些内容,则包含了MFC,CRt的一些DLL的信息。所以我们需要先merge这两个manifest,在嵌入到exe中去(mt.exe -manifest ...),但另外一个简单的方法,就是把com.exe.manifest直接加入到两个工程中,这样在build的时候,就会将该manifest的内容添加进去 - 你可以用VS打开exe文件,查看里面的 RT_MANIFEST项。

具体可以下载sample:RegistryFree_COMExe


无需注册实现任意COM组件调用的完整技术方案 NET Framework通过Runtime Callable Wrapper(RCW)抽象了底层COM调用细节。CLR在解析类型时,优先检查应用程序配置和清单信息,支持直接绑定未注册的.tlb文件。这使得开发者可在不接触注册表的情况下完成完整COM交互,标志着COM互操作进入“托管优先”新时代。 阅读详情

相关推荐

免注册调用COM组件方法二-Assembly Manifests

众所周知,通过Assembly Manifests,我们可以免注册调用各种进程内的COM组件,包括DLL组件和OCX控件等。这里提供一个用于快速创建Assembly Manifest文件的工具。这个工具本身就是通过Assembly Manifests来免注册调用COM(TLBINF32.DLL)和OCX(COMDLG32.OCX)来实现的,具体怎么实现请参考里面的VB6源码。

DECLARE_CLASSFACTORY_SINGLETON 宏

DECLARE_CLASSFACTORY_SINGLETON This macro declares CComClassFactorySingleton to be the class factory.DECLARE_CLASSFACTORY_SINGLETON( obj) Parameters obj [in] The name of your class object. ...

weixin_30410999的博客 223

利用MFC编写进程外COM

利用MFC嵌套类编写进程外COM,是对潘爱民先生的com原理及应用的补充!

ATL COM 单实例的实现

 在类的实现代码中加入如下宏DECLARE_CLASSFACTORY_SINGLETON( CXXXXXXXXXXX )  对象的创建过程要使用类厂的方式创建如下代码,是在com实现dll中的实现方式extern HRESULT STDAPICALLTYPE DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID*

bgslyao的专栏 1121

fibplus-8.0.0.zip

FIBPlus 是一套面向 Delphi / C++Builder 的 Firebird、InterBase 数据库访问组件,特点是直接走原生客户端 API,不经 BDE/ODBC,速度快且可控性强。8.0.0 版本主要适配 Delphi 2009 及以后的版本(Delphi 6–2007 需用 7.9.x),核心组件包括 TpFIBDatabase、TpFIBTransaction、TpFIBDataSet 等,支持精细事务管理、本地缓存、BLOB 处理和备份恢复等数据库服务。该库原为 Devrace 的商业组件,现由社区在 GitHub 的 madorin/fibplus 项目开源维护,建议从官方仓库获取源码而非第三方网盘压缩包。安装时解压后用对应版本的工程组(10.4+ 统一为 `FIB.groupproj`)Build 全部包,再 Install `dclFIB` 并在 Library 路径加入 Source 目录即可。新项目中若需官方技术支持,也可考虑 FireDAC、IBDAC 等更现代的替代方案。

ubuntu18.04 显卡驱动问题 造成屏幕分辨变大 NVIDIA-SMI has failed because it couldn't communicate with ....等问题

问题1:装好了显卡驱动,cudnn,tensorflow等没问题,一直可以用。但是突然有一天不行了,终端输入:nvidia-smi 显示:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed...

梦萦飞--CV/DL/ML 2248

进程外COM组件的一个实例

之前写过一篇使用COM组件的3种方法的文章:启动COM组件的三种机制,其中后来补充了一个用免注册的方式使用进程外COM组件的方法,因为只是文字补充,没有实例,可能对于怎么实现大家不是很清楚,陆续收到一些同学的信,希望能给个例子。 所以干脆补充一篇,自己也恰好复习一下。 步骤大概是这样的: 我有一个com.exe的进程外com组件,暴露出一个ITestObject的接口。现在Customized...

weixin_33898233的博客 490

FPGA+CMV4000实战:从零搭建20fps成像系统的5个关键步骤(附避坑指南)

本文详细介绍了如何从零搭建基于FPGA和CMV4000传感器的20fps成像系统,涵盖硬件选型、SPI通信优化、LVDS数据采集、DDR2内存管理及系统集成等5个关键步骤。特别针对CMV4000传感器的SPI配置和高速数据处理的常见问题提供实用解决方案,帮助开发者避免常见陷阱,提升成像系统性能。

weixin_42628688的博客 427

使用清单Manifest免注册调用COM组件

前言 虽然ActiveX已被淘汰,但是又没有新的解决方案来替代ActiveX,好多公司都会使用ActiveX解决网页调用本地资源。ActiveX最容易注册出现问题,所以我们接上一篇关于微软的Manifest的那些事,我们谈下如何运用清单Manifest,来实现免注册调用COM组件,也就是调用ActiveX。 准备工作 首先准备一个工具regsvr42.exe,用来提取com组件的注册信息,在命令行中输入 regsvr42 JITCertActiveX.dll 然后就生成了一个JITCertActiveX

q893332169的博客 2256

UG/NX二次开发实例流程样例(nx1980+vs2019)

以上就是基本操作了,下面进入界面开发流程,nx1980的界面开发操作,也需要在块UI界面编辑器中操作,很多教程都没有讲解这一点,尤其是如何进入块UI界面编辑器,那么我在这里详细说明一下步骤。》,这一篇文章我们将详细讲述,如何开发一个具体的功能——根据用户输入的数据,在特定的点上创建一个指定大小的立方体。可以将文件保存当桌面,笔者保存在桌面的create_block目录中了,如下图所示,可以发现生成了三个文件。4.在新建模型完成后,我们准备创建交互UI,按照下图所示的顺序,找到块UI界面编辑器,。

秋月的私语 1万+

从“跳变”到“连续”:深入理解霍尔传感器插值与PLL角度估算的优劣与选择

本文深入解析霍尔传感器角度估算技术,对比线性插值法和锁相环(PLL)跟踪法的优劣,为电机控制领域的工程师提供实用指南。通过STM32F407和CubeMX的实例,详细探讨两种方法的实现细节、性能对比及优化策略,帮助在不同应用场景下做出最优选择。

weixin_30855761的博客 557

跨权限Register-Free COM进程外组件

跨权限Register-Free COM进程外组件 启动COM组件的三种机制 上面的文章说的是在不能使用注册表的情况下如何继续使用进程外COM组件。说到的一个必要内容就是需要写好manifest文件。 作为COM组件的特性,其中一条就是灵活配置,这时,如果每增加删除一个组件,所有相关的使用者都要修改manifest文件,恐怕这样的工作对于维护的人来说是个地狱。 那么,有没有一种不需要额外配置的进程...

魔芋的专栏 793

数学文化赏析MOOC笔记【2023】

深圳大学UOOC课程《数学文化赏析》课程笔记

simplenthpower的博客 1751

QT调用COM进程外组件(EXE)实战指南

COM(Component Object Model)是Windows平台底层的二进制组件互操作标准,其进程外(Out-of-Process)模式通过独立EXE实现物理级隔离,显著提升系统稳定性与故障容错能力。该机制不依赖DLL共享内存,而是基于RPC序列化、注册表激活和STA线程模型,在工业控制、医疗设备、金融终端等高可靠性场景中不可替代。相较于QtRemoteObjects等跨进程方案,COM OOP具备原生系统集成、零配置部署和成熟诊断工具链(如oleview.exe)等工程优势。本文聚焦QT 5.1

weixin_29188997的博客 261

LaMAR数据集下载和使用流程

LaMAR数据集

qq_51745206的博客 971

深入解析SVPWM七段式与五段式调制的电压波形差异及优化策略

本文深入解析了SVPWM七段式与五段式调制在相电压和线电压波形上的核心差异。七段式波形对称、谐波含量低,适合追求静音与性能的场景;五段式开关次数少、损耗低,适用于对效率与散热要求高的应用。文章提供了基于谐波与损耗权衡的优化策略与选型指南。

weixin_29216957的博客 439

Windows-universal-samples 中的 WRL Out-of-Process WinRT 组件:用 C++/WRL 编写跨进程组件并被 C++、C、JavaScript 消费

本文围绕 Windows-universal-samples 仓库中的 WRLOutOfProcessWinRTComponent 示例([Samples/WRLOutOfProcessWinRTComponent/README.md](https://link.gitcode.com/i/54091bcefcb3266a866030c783f60ee2)),完整讲解如何用 WRL(Windows

gitblog_01036的博客 234

Vibe Coding 工具实战案例全解:Cursor、Claude Code、Codex 真实项目 30 分钟到 4 小时快速构建指南(2026 年最新)

2026年VibeCoding工具实战案例精选:1)使用Cursor在30分钟内构建现代TodoList应用(Next.js+TS+Tailwind);2)通过ClaudeCode纯终端2小时开发3D飞行射击游戏(Three.js+R3F);3)利用OpenAICodex多Agent并行4小时完成SaaS全栈开发(Next.js+Supabase+Stripe)。案例均来自真实项目,覆盖从入门到生产级开发,重点展示:自然语言Prompt技巧、迭代反馈方法、工具特性对比(Cursor可视化最佳/Claude推

hy行者勇哥的博客 3172

Buzz:免费离线语音转文字,本地直出字幕

两小时的会议录音,Buzz 几分钟就能变成一份带时间戳的 SRT 文件,全程不联网。它是基于 OpenAI 开源 Whisper 模型的本地语音转文字工具:导入音频或视频,离线转写出带时间轴的文字稿,同时支持翻译任务与字幕导出。云端转写服务按分钟计费,录音还要上传到第三方服务器,Buzz 的音频不离开本机,模型下载一次,之后断网也能转。 ## 五分钟内拿到第一份文字稿 1. 安装程序。macO

gitblog_00849的博客 420

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Stride Shader 语法高亮 VSIX 完全指南:TextMate 语法生成与 Visual Studio 即时着色实现

Stride(原 Xenko)作为一款跨平台 C# 游戏引擎,其着色器文件以 `.sdsl`(Stride Shader Language)与 `.sdfx`(效果定义)两种扩展名存在于整个引擎与项目管线中。本指南以仓库内 `sources/tools/Stride.VisualStudio.Package.Shaders` 项目为对象,系统讲解 Stride 如何通过一个**仅包含内容(cont

gitblog_00068的博客 521

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Nuclio 仓库开发指南:构建、测试命令、架构脉络与代码规范全解析

Nuclio 是一个面向实时数据/事件处理场景的高性能 Serverless(无服务器)框架,它将用户编写的"函数处理器(function handler)"编译并打包成容器镜像,运行在 Kubernetes(或本地 Docker)之上,并从多种事件源(trigger)向函数持续投喂事件。本文以仓库根目录的 [AGENTS.md](https://link.gitcode.com/i/396e38

gitblog_01060的博客 269

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

GLM-5.3-Flash-w8a8-mxfp8推理参数调优:8个技巧让temperature、top_p与Reasoning Effort发挥最大效果

GLM-5.3-Flash-w8a8-mxfp8 是一款采用 W8A8 MXFP8 量化部署的多模态 MoE 大模型,支持约 100 万 token 长上下文。想让它的推理效果更好,核心在于三个参数:**temperature、top_p 与 reasoning_effort(Reasoning Effort)**。本文提供一套新手也能直接上手的推理参数调优指南,帮你快速找到稳定与创造性的平衡点。

gitblog_00220的博客 725

Slicer 脚本化 GUI 操作指南:从命令行启动、MRML 场景控制到视图与快捷键定制

本文是一份以 3D Slicer(Slicer)的 `slicer` Python API 为核心的实战指南,主题覆盖:如何在命令行中以不同方式启动 Slicer 并加载数据、如何通过脚本读写 MRML 场景与节点、如何编程控制切片视图 / 3D 视图 / 十字光标 / 颜色表与图例、如何自定义键盘快捷键与鼠标手势,以及如何用脚本安装扩展与 Python 包。读者读完本文后,可以掌握一套完整的"无

gitblog_00420的博客 1044

免注册调用COM组件的两种办法

免注册调用COM组件两种方法总结,直接调用DllGetClassObject 和使用Manifest清单文件。

Zezese的专栏 2541

windows 免注册COM (配置manifest)

Windows XP 引入了一种新的 COM 激活模型,称为: 免注册COM,简称为 Reg-Free COM。简单地说,Reg-Free COM 是 COM 组件的注册表替代品。它通过将通常安装到系统注册表中的所有标准组件注册信息表达在一个文件中,该文件可以存储在与应用程序本身相同的文件夹中。 免注册COM技术,操作系统在加载EXE时会自动扫描是否包含配套的manifest信息,若有则读取manifest内容加载组件,否则读取注册表。 manifest描述了EXE里面引用了哪个DLL库、D...

lyhoo163的专栏 5042

免注册进程外COM组件Demo的完整创建过程

最近由于我们产品的需求,要实现一个免注册的进程外COM,特意花了几天时间来研究这个东西,最终整个技术流程还是走通了,特意在此总结一下,不仅是对前面几天技术研究的总结,也能帮助到后面需要使用此技术的其他人。至于为什么选择免注册的进程外COM组件,是因为我们产品需要在一台机器上运行多份实例,如果用全局共享的注册方式,就要考虑组件各个版本的兼容问题,这个是一个很难处理的问题,因此最终还是选择了免注册的COM组件的方式,这样即能通过COM技术实现跨进程通信,也不用考虑多版本之间的兼容问题。

萧戈的专栏 1064
上一篇: COM组件与javascript 交互问题
下一篇: 去掉微信浏览器里的放大缩小按钮
FlySpace
博客等级 码龄27年 17粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值