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
HRESULT hr = CoGetClassObject(CLSID_MyEvent, CLSCTX_LOCAL_SERVER, NULL, __uuidof(pFactory), reinterpret_cast
IMyEventPtr pResult ;
hr = pFactory->CreateInstance(NULL, __uuidof(IMyEvent), reinterpret_cast
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690875709a452549.html
评论列表(0条)