免注册com组件-进程外组件

免注册com组件-进程外组件

2023年8月1日发(作者:)

免注册com组件-进程外组件最近在搞进程外组件通信的东西,写了个demo,免注册的,⼀直没调通,其实就是两个问题卡了好⼏天,也没找到有⽤的资料,试了好⼏天终于才解决,现简单记录下来,免得⼤家跟我⾛⼀样的弯路。下⾯com端名称简写为遇到的问题:1. 调⽤ CoGetClassObject, 返回hr = 0x80040154 没有注册类 (原回:注册版的未注册,免注册版的未运⾏) 2. IClassFactory::CreateInstance(),返回hr = 0x80029c4a 加载类型库/DLL 时出错。(两个exe不在同⼀⽬录或与manifest中指定的路径不⼀致)实现 :1.需要添加*.st⽂件, Add进⼯程,Build.

注: manifest中填写的com端exe路径必须是com exe 的真实存放路径(默认在同级⽬录下),可设置相对路径(如),可嵌⼊到exe,不必放在exe同级⽬录。manifest⽂件例:

hashalg="SHA1">

2. #import "*.tlb" ,⽬录随意,不必放在exe同级⽬录。3.客户端与com端必须以相同权限运⾏。如:同为管理员权限或同为⼀般权限,否则失败。可在调⽤端使⽤CreatProcess()保证是统⼀权限。4.客户端获取com端接⼝前必须保证 在运⾏状态,这个运⾏的必须是manifest⽂件中指定路下的(⼀般与调⽤端exe放在同级),且与调⽤端权限统⼀。

客户端获取接⼝代码例 :

//初始化

AfxOleInit();

或::CoInitialize(NULL);

//启动com端进程(权限统⼀哦)

//⾮必须-----------------------------------------

STARTUPINFO si;

PROCESS_INFORMATION pi;

::ZeroMemory( &si,sizeof(STARTUPINFO) );

= sizeof(STARTUPINFO);

s = STARTF_USESHOWWINDOW;

indow = SW_HIDE;

BOOL b =::CreateProcess(_T("E:"),NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);//⾮必须-----------------------------------------

//获取接⼝

CComPtr pFactory;

HRESULT hr = CoGetClassObject(CLSID_MyEvent, CLSCTX_LOCAL_SERVER, NULL, __uuidof(pFactory), reinterpret_cast(&pFactory));

IMyEventPtr pResult ;

hr = pFactory->CreateInstance(NULL, __uuidof(IMyEvent), reinterpret_cast(&pResult));其实注册版和免注册版的区别就是⼀个⽤注册表,⼀个⽤manifest代替注册表,注册版的在build时在注册表⾥写死了的绝对路径(可修改rgs⽂件使其不注册),但免注册版就得注意在编写manifest⽂件时保证的路径问题了。权限问题两种版本都⼀样,得统⼀!

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690875709a452549.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信