• 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    }
  • 相关阅读:
    07-2. A+B和C (15)
    07-1. 换个格式输出整数 (15)
    07-0. 写出这个数 (20)
    06-3. 单词长度(15)
    06-2. 字符串字母大小写转换(10)
    06-1. 简单计算器(20)
    06-0. 混合类型数据格式化输入(5)
    05-3. 求a的连续和(15)
    05-2. 念数字(15)
    05-1. 约分最简分式(15)
  • 原文地址:https://www.cnblogs.com/dazhu/p/2871932.html
Copyright © 2020-2023  润新知