zoukankan      html  css  js  c++  java
  • 进程外组件通信之免注册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的路径问题了。权限问题两种版本都一样,得统一!

  • 相关阅读:
    元素的高度自适应
    关于IE6的一些常见的CSS BUG处理
    Vue项目在IE浏览器报错polyfilleventsource added missing EventSource to window
    Springboot使用JdbcTemplate RowMapper查询,直接返回实体列表
    Springboot启动工程后,浏览器出现输入用户名和密码
    mysql5.6 zip版本如何安装
    python基础基础知识介绍
    python基础数据类型,集合及深浅copy
    格式化输出
    python基础windows环境下 安装python2和python3
  • 原文地址:https://www.cnblogs.com/wcadaydayup/p/4261777.html
Copyright © 2011-2022 走看看