最近在搞进程外组件通信的东西,写了个demo,免注册的,一直没调通,其实就是两个问题卡了好几天,也没找到有用的资料,试了好几天终于才解决,现简单记录下来,免得大家跟我走一样的弯路。下面com端程序名称简写为com.exe
遇到的问题:

1. 调用 CoGetClassObject, 返回hr = 0x80040154 没有注册类 (原回:注册版的未注册,免注册版的未运行)
2. IClassFactory::CreateInstance(),返回hr = 0x80029c4a 加载类型库/DLL 时出错。(两个exe不在同一目录或与manifest中指定的路径不一致)

一、实现步骤:
1.需要添加*.exe.manifest文件, Add进工程,Build.
注: manifest中填写的com端exe路径必须是com.exe 的真实存放路径(默认在同级目录下),可设置相对路径(如Other\\ComExeDemo.exe),可嵌入到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\\com.exe" 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. #import "*.tlb" ,目录随意,不必放在exe同级目录。

3.客户端与com端必须以相同权限运行。如:同为管理员权限或同为一般权限,否则失败。可在调用端使用CreatProcess(Other\\ComExeDemo.exe)保证是统一权限。

4.客户端获取com端接口前必须保证com.exe 在运行状态,这个运行的com.exe必须是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\\ComExeDemo.exe"),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时在注册表里写死了com.exe的绝对路径(可修改rgs文件使其不注册),但免注册版就得注意在编写manifest文件时保证com.exe的路径问题了。权限问题两种版本都一样,得统一!

进程外组件通信之免注册com通信【原创】的更多相关文章

  1. 【转载】进程内COM与进程外COM

    原文:http://www.cnblogs.com/jyz/archive/2009/03/08/1406229.html 1.进程内和进程外Com COM/DCOM 组件可以在DLL 或EXE 文档 ...

  2. 进程内COM与进程外COM

    1.进程内和进程外Com COM/DCOM 组件可以在DLL 或EXE 文档中实现. 其中在 DLL 中实现的COM/DCOM组件称为 In-Process Server,因为这些组件是加载到使用它们 ...

  3. 在Delphi下使用迅雷APlayer组件进行免注册开发

    之前都是用的delphi下的dspack进行的视频开发,这个组件其实很好用,就是找解码器麻烦点,而且还得在客户的计算机上使用RegSvr32.exe也注册解码器,要不有可能播放不了. 结果在查找合适的 ...

  4. 进程外Session保存和全局文件错误捕获

    Session深入学习,进程外的Session 当用户登入页面跳转时候,我们会将用户登录信息保存在服务端一个键值对的Session(Session池)中.那么Session池又是在哪里呢? 它最终默认 ...

  5. 自己实现一个Electron跨进程消息组件

    我们知道开发Electron应用,难免要涉及到跨进程通信,以前Electron内置了remote模块,极大的简化了跨进程通信的开发工作,但这也带来了很多问题,具体的细节请参与我之前写的文章: http ...

  6. 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  7. .net学习之进程外Session的配置

    转载地址:http://www.cnblogs.com/rohelm/archive/2012/05/13/2498465.html 人人都知道怎么去使用session,但是初学者,尤其是自学的学生可 ...

  8. 进程外session

    进程外session A  SqlServer 1.管理员身份运行cmd 2.更换目录  cd c:\Windows\Microsoft.NET\Framework\v4.0.30319> 3. ...

  9. 基于Git项目管理客户端SourceTree的免注册安装及远程连接方法

    作为程序员,不可避免的要在github上查询代码,而在企业项目中,为了使得项目好管理需要使用项目管理客户端,所以接下来详细讲解一下基于git的sourceTree在windows系统下的安装及与Git ...

随机推荐

  1. 五个新知识:微软SHA2补丁,亚信专业工具,微软官方文档,使用过期签名(附官方推荐链接),注意使用具有UAC的CMD

    五个新知识:微软SHA2补丁,亚信专业工具,微软官方文档,使用过期签名 不支持SHA2算法的计算机更新补丁:https://technet.microsoft.com/zh-CN/library/se ...

  2. 删除WIN7系统的共享文件

    运行里面输入fsmgmt.msc命令,点开共享目录,选定要取消共享的文件右键,停止共享.

  3. gcc编译时头文件库文件搜索顺序(转)

    原文: http://blog.csdn.net/silentfly1987/article/details/6119195

  4. 创建git repo

    http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Getting a Git Repository You can get ...

  5. 常用的MIME类型(资源的媒体类型)

    后缀名 MIME名称 *.3gpp audio/3gpp, video/3gpp *.ac3 audio/ac3 *.asf allpication/vnd.ms-asf *.au audio/bas ...

  6. SpringMVC文件上传与下载

    一.关键步骤 ①引入核心JAR文件 SpringMVC实现文件上传,需要再添加两个jar包.一个是文件上传的jar包,一个是其所依赖的IO包.这两个jar包,均在Spring支持库的org.apach ...

  7. Android设备中实现Orientation Sensor(图)兼谈陀螺仪

    设备中的三自由度Orientation Sensor就是一个可以识别设备相对于地面,绕x.y.z轴转动角度的感应器(自己的理解,不够严谨).智能手机,平板电脑有了它,可以实现很多好玩的应用,比如说指南 ...

  8. POJ 2502 Subway(迪杰斯特拉)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 2177 Descriptio ...

  9. auto and static key words

    ---恢复内容开始--- 对堆栈怎样实现函数调用的描述也同时解释了为什么不能从函数中返回一个指向该函数局部自动变量的指针,例如: 当进入该函数时,自动变量deciduous在堆栈中分配.但函数结束后, ...

  10. Python 日期和时间(转)

    Python 日期和时间 Python程序能用很多方式处理日期和时间.转换日期格式是一个常见的例行琐事.Python有一个 time 和 calendar 模组可以帮忙. 什么是Tick? 时间间隔是 ...