zoukankan      html  css  js  c++  java
  • COM的一点点

    1.创建接口 用ATL Simple Object 创建的

    2. 客户端调用时候创建com对象

    CComPtr<IDispatch> obj;
    obj.CoCreateInstance(CLS_.... )
    obj.CoCreateInstance("obj.objname.1")
    

    3. 参数尽量用 VARIANT js交互认这个
    4. 事件回调需要主线程处理, 创建个隐藏窗口来传递消息

    5. 

    c++
    处理事件
    继承IDispEventImpl

    _ATL_FUNC_INFO sfi_OnMsg = {CC_STDCALL, VT_EMPTY, 7, { VT_VARIANT, VT_VARIANT, VT_VARIANT, VT_VARIANT, VT_VARIANT, VT_VARIANT,VT_VARIANT}};
    
    BEGIN_SINK_MAP(CSynthImageHelper)
    SINK_ENTRY_INFO(1, DIID__event, 1000, oncall, &sfi_OnMsg)	
    END_SINK_MAP()
    

    调用
    DispEventAdvise 来绑定com和事件响应

    6. 

    CComVariant
    CComPtr 

    2个智能指针非常有用

    7. js可以把js函数当回调给com, com中事件完成后可以调用

     1 CComVariant callback; 
     2 
     3 假设3个参数
     4    CComVariant result;
     5    VARIANTARG  args[3];
     6    DISPPARAMS  dispParams = {0};
     7    dispParams.cNamedArgs = 0;
     8    dispParams.cArgs = sizeof(args) / sizeof(VARIANTARG);
     9    dispParams.rgvarg = args;
    10 
    11    memcpy((void*) &dispParams.rgvarg[0], (void*)&arg2, sizeof(VARIANT));
    12    memcpy((void*) &dispParams.rgvarg[1], (void*)&arg1, sizeof(VARIANT));
    13    memcpy((void*) &dispParams.rgvarg[2], (void*)&arg0, sizeof(VARIANT));
    14 
    15  
    16    if (callback.vt == VT_DISPATCH && callback.pdispVal)
    17    {
    18       EXCEPINFO excepInfo;
    19       memset(&excepInfo, 0, sizeof(EXCEPINFO));
    20 
    21       UINT nArgErr = (UINT)-1;  // initialize to invalid arg
    22       
    23 
    24          hr = callback.pdispVal->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT,
    25             DISPATCH_METHOD, &dispParams, &result, &excepInfo, &nArgErr);
    26    }
  • 相关阅读:
    水库采样算法
    在Windows的控制台和Linux的终端中显示加载进度
    如何在普通用户权限cmd怎么使用命令行变为管理员权限
    MySql命令行无法显示中文
    MySql精简
    C语言中的数据类型转换函数
    关于C语言命令行参数问题
    postgres 基本操作
    简单的实现HTTP密码验证登陆
    filebeat+logstash配置
  • 原文地址:https://www.cnblogs.com/dazhu/p/2871932.html
Copyright © 2011-2022 走看看