免注册com组件-进程外组件
最近在搞进程外组件通信的东西,写了个demo,免注册的,⼀直没调通,其实就是两个问题卡了好⼏天,也没到有⽤的资料,试了好⼏天终于才解决,现简单记录下来,免得⼤家跟我⾛⼀样的弯路。下⾯com端名称简写为
遇到的问题:1. 调⽤ CoGetClassObject, 返回hr = 0x80040154 没有注册类  (原回:注册版的未注册,免注册版的未运⾏)
createprocessa
2. IClassFactory::CreateInstance(),返回hr = 0x80029c4a 加载类型库/DLL 时出错。(两个exe不在同⼀⽬录或与manifest中指定的路径不⼀致)
实现 :
1.需要添加*.exe.manifest⽂件, Add进⼯程,Build.
注: manifest中填写的com端exe路径必须是com exe 的真实存放路径(默认在同级⽬录下),可设置相对路径(如
Other\\),可嵌⼊到exe,不必放在exe同级⽬录。
manifest⽂件例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="Other\\" hashalg="SHA1">
<typelib tlbid="{F8311364-981D-4237-A33E-6738DCD1457B}" version="1.0" helpdir="" flags="HASDISKIMAGE"></typelib>
</file>
<comInterfaceExternalProxyStub name="IMyEvent" iid="{871965EB-D4BC-4131-9F97-2714105F9E76}" tlbid="{F8311364-981D-4237-A33E-
6738DCD1457B}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
</assembly>
2. #im p or t "*.tlb" ,⽬录随意,不必放在e x e同级⽬录。
3.客户端与com端必须以相同权限运⾏。如:同为管理员权限或同为⼀般权限,否则失败。可在调⽤端使⽤
CreatProcess(Other\\)保证是统⼀权限。
4.客户端获取com端接⼝前必须保证 在运⾏状态,这个运⾏的必须是manifest⽂件中指定路下的(⼀般与调⽤端exe放在同级),且与调⽤端权限统⼀。
客户端获取接⼝代码例 :
//初始化
AfxOleInit();
或::CoInitialize(NULL);
//启动com端进程(权限统⼀哦)
//⾮必须-----------------------------------------
STARTUPINFO si;
PROCESS_INFORMATION pi;
::ZeroMemory( &si,sizeof(STARTUPINFO) );
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
BOOL b =
::CreateProcess(_T("E:\\CodeExercise\\vs2005\\COMDemo1Client\\debug\\11\\"),NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); //⾮必须-----------------------------------------
//获取接⼝
CComPtr<IClassFactory> pFactory;
HRESULT hr = CoGetClassObject(CLSID_MyEvent, CLSCTX_LOCAL_SERVER, NULL, __uuidof(pFactory), reinterpret_cast<void**>(&pFactory)); IMyEventPtr pResult ;
hr = pFactory->CreateInstance(NULL, __uuidof(IMyEvent), reinterpret_cast<void**>(&pResult));
其实注册版和免注册版的区别就是⼀个⽤注册表,⼀个⽤manifest代替注册表,注册版的在build时在注册表⾥写死了的绝对路径(可修改rgs⽂件使其不注册),但免注册版就得注意在编写manifest⽂件时保证的路径问题了。权限问题两种版本都⼀样,得统⼀!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。