进程外组件通信之免注册com通信【原创】
最近在搞进程外组件通信的东西,写了个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通信【原创】的更多相关文章
- 【转载】进程内COM与进程外COM
原文:http://www.cnblogs.com/jyz/archive/2009/03/08/1406229.html 1.进程内和进程外Com COM/DCOM 组件可以在DLL 或EXE 文档 ...
- 进程内COM与进程外COM
1.进程内和进程外Com COM/DCOM 组件可以在DLL 或EXE 文档中实现. 其中在 DLL 中实现的COM/DCOM组件称为 In-Process Server,因为这些组件是加载到使用它们 ...
- 在Delphi下使用迅雷APlayer组件进行免注册开发
之前都是用的delphi下的dspack进行的视频开发,这个组件其实很好用,就是找解码器麻烦点,而且还得在客户的计算机上使用RegSvr32.exe也注册解码器,要不有可能播放不了. 结果在查找合适的 ...
- 进程外Session保存和全局文件错误捕获
Session深入学习,进程外的Session 当用户登入页面跳转时候,我们会将用户登录信息保存在服务端一个键值对的Session(Session池)中.那么Session池又是在哪里呢? 它最终默认 ...
- 自己实现一个Electron跨进程消息组件
我们知道开发Electron应用,难免要涉及到跨进程通信,以前Electron内置了remote模块,极大的简化了跨进程通信的开发工作,但这也带来了很多问题,具体的细节请参与我之前写的文章: http ...
- 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- .net学习之进程外Session的配置
转载地址:http://www.cnblogs.com/rohelm/archive/2012/05/13/2498465.html 人人都知道怎么去使用session,但是初学者,尤其是自学的学生可 ...
- 进程外session
进程外session A SqlServer 1.管理员身份运行cmd 2.更换目录 cd c:\Windows\Microsoft.NET\Framework\v4.0.30319> 3. ...
- 基于Git项目管理客户端SourceTree的免注册安装及远程连接方法
作为程序员,不可避免的要在github上查询代码,而在企业项目中,为了使得项目好管理需要使用项目管理客户端,所以接下来详细讲解一下基于git的sourceTree在windows系统下的安装及与Git ...
随机推荐
- 理解 break, continue, return 和 exit
你们知道 “break”, “continue”, “return” 和 “exit”的作用吗? 它们是功能强大的语言结构体.下面通过一个测试函数来说明它们之间的不同. 1 2 3 4 5 6 7 8 ...
- #pragma execution_character_set的意义
就是设置执行字符集,指示char的执行字符集是UTF-8编码.如果源文件中出现中文,必须要设置为 #if _MSC_VER >= 1600 #pragma execution_ch ...
- VS2008 运行VC\Bin下的link.exe, cl.exe, lib.exe提示找不到mspdb80.dll的解决方法
天在用link.EXE的LIB命令生成用于连接(LINK)使用的lib文件时提示:找不到mspdb80.dll. 原因:Microsoft Visual Studio\VC\Bin\下没有 “msob ...
- YII 事件event和行为Behavior
To declare an event in your CComponent child class, you should add a method with aname starting with ...
- ~/.bashrc的常用alias设置
centos6.5系统中,alias定义在/etc/bashrc,分别写在/etc/profile.d/*.sh中,可以在此目录添加my.sh, alias attrib='chmod'alias c ...
- SPOJ 0962 Intergalactic Map
题目大意:在一个无向图中,一个人要从A点赶往B点,之后再赶往C点,且要求中途不能多次经过同一个点.问是否存在这样的路线.(3 <= N <= 30011, 1 <= M <= ...
- POJ2761---Feed the dogs (Treap求区间第k大)
题意 就是求区间第k大,区间 不互相包含. 尝试用treap解决一下 第k大的问题. #include <set> #include <map> #include <cm ...
- MySQL添加外键的方法
为book表添加外键: <1>明确指定外键的名称: 语法:alter table 表名 add constraint 外键的名称 foreign key(你的外键字段名) REFERENC ...
- Android学习笔记(二)之异步加载图片
最近在android开发中碰到比较棘手的问题,就是加载图片内存溢出.我开发的是一个新闻应用,应用中用到大量的图片,一个界面中可能会有上百张图片.开发android应用的朋友可能或多或少碰到加载图片内存 ...
- UDP C/S编程
UDP C/S编程的步骤如下图所示与TCP C/S通信的区别在于:服务端没有设置监听和等待连接的过程.客户端没有连接服务端的过程.基于UDP的通信时不可靠地,面向无连接的,发送的数据无法确切知道对方收 ...