惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
V
V2EX
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
小众软件
小众软件
Vercel News
Vercel News
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
J
Java Code Geeks
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog
B
Blog
美团技术团队
量子位

博客园 - 吴碧宇

NPM私有服务器架设 FOR CentOS 【转】c# 位操作 C#中调用Windows API时的数据类型对应关系 全面理解javascript的caller,callee,call,apply概念[转载] 发几个小的测式软件 用户中心 - 博客园 Vs2010 配置驱动开发环境 美杜杉 主动防御最新版 Asp.net 异步请求 IHttpAsyncHandler [转]COM线程模型-套间 [转]VC使用CRT调试功能来检测内存泄漏 [转]c#中 uint--byte[]--char[]--string相互转换汇总 [转]C++深度探索系列:智能指针(Smart Pointer) [一] [转]DirectShow+VS2005配置日记 [转]Windows API 注册表函数 特殊符号表 【转】C++反射机制的实现 常用数据类型使用转换详解 - 吴碧宇 - 博客园 [转]BSTR、char*和CString short转换
ATL 开发 Com 学习笔记
吴碧宇 · 2009-07-02 · via 博客园 - 吴碧宇

Com 学习笔记

1.       数组数据类型(SAFEARRAYVARIANT

A、 返回JS数组。

//测试JS,C#等应用中返回数组值。

STDMETHODIMP CTestCall::GetArray(VARIANT* arrays)

{

     // TODO: 在此添加实现代码

     //返回数组

     SAFEARRAYpsa;

     //数组维数

     SAFEARRAYBOUND rgsabound[1];

     rgsabound[0].lLbound = 0;

     rgsabound[0].cElements = 2;

     psa=SafeArrayCreate(VT_VARIANT,1,rgsabound);//我这里原来没用VT_VARIANT,而是用了VT_I4类型,结果会导致JS代码中new VBArray出错,请一定注意

     LONG index;

     //赋值方法1

     CComVariant setdt(4,VT_I4);

     index = 0;

     SafeArrayPutElement(psa,&index,&setdt);

     index=1;

     setdt = 2;

     SafeArrayPutElement(psa,&index,&setdt);

     //赋值方法2

     VARIANT* v;

     SafeArrayAccessData(psa,(void HUGEP **) &v);

     setdt=1;

     v[0] = setdt;

     setdt = 7;

     v[1] = setdt;

     SafeArrayUnaccessData(psa);

     //返回安全数组

     CComVariant rhArray(psa);

     ::VariantInit(arrays);

     arrays->vt = VT_EMPTY;

     rhArray.Detach(arrays);

     //V_VT(arrays) = VT_ARRAY | VT_VARIANT;

     //V_ARRAY(arrays) = psa;   

     return S_OK;

}

B测试应用程调用传入数组值。

STDMETHODIMP CTestCall::SetSafeArray(SAFEARRAY * safeArry)

{

     // TODO: 在此添加实现代码

     //this->safeArray = safeArray;

     LONG *v;

     SafeArrayAccessData(safeArry ,(void HUGEP **) &v);

     v[0] = 100;

     SafeArrayUnaccessData(safeArry);

     ::SafeArrayCopy((LPSAFEARRAY)safeArry, &this->safeArray);

     return S_OK;

}

C测试js脚本传入对象。

STDMETHODIMP CTestCall::SetJSArray(VARIANT jsArray)

{

     // TODO: 在此添加实现代码

     if(jsArray.vt != VT_DISPATCH)

         return DISP_E_TYPEMISMATCH;

     CComVariant result;

     CComPtr<IDispatch> js(jsArray.pdispVal);

     js.GetPropertyByName(OLESTR("length"),&result);

     js.GetPropertyByName(OLESTR("1"),&result); //这里代表 var jsArray = new Array();数组的序号。

     return S_OK;

}

2、伪异步测试

//Com 中的线程

void ThreadFN(void * p )

{

    CoInitialize(0);

    CComPtr<IDispatch> spCallback;

    threadParams * params2;

    params2 = (threadParams * )p;

    HRESULT hr = CoGetInterfaceAndReleaseStream(params2->istream,IID_NULL,(void **)&spCallback); //取出列集

    if(SUCCEEDED(hr))

    {

        // 参数准备

        CComVariant varResult;

        CComVariant avarParams[3];

        avarParams[0] = "开始计算股票";        // bstrProgressName

        avarParams[0].vt = VT_BSTR;

        avarParams[1] = 100;                              // nTotalProgress

        avarParams[1].vt = VT_I4;

        avarParams[2] = 0;                                 // nCurrentProgress

        avarParams[2].vt = VT_I4;

        DISPPARAMS params = { avarParams, NULL, 3, 0 };

        // DOUBLE v1 = 100;

        // DOUBLE v2 = 200;

        if(spCallback)

             spCallback->Invoke(0,

             IID_NULL,

             LOCALE_USER_DEFAULT,

             DISPATCH_METHOD,

             &params, &varResult, NULL, NULL);

        BOOL bFinished = false;

        int i=0;

        while(!bFinished)

        {

             // 计算工作…

             Sleep(1000);

             params2->v1 = params2->v1+params2->v2;

             // 回调客户

             if(spCallback)

             {

                  avarParams[0] = "正在计算股票";

                  avarParams[2] = i;

                  spCallback->Invoke(0,

                      IID_NULL,

                      LOCALE_USER_DEFAULT,

                      DISPATCH_METHOD,

                      &params, &varResult, NULL, NULL);

             }

             if(i == 10)

                  bFinished = TRUE;

             i = i+1;

        } // while OK!

    }

    delete(p);

    CoUninitialize();

}

STDMETHODIMP CjsCom::mycallback(DOUBLE v1, DOUBLE v2, VARIANT scriptCallback)

{

    // TODO: 在此添加实现代码

    CComPtr<IDispatch> spCallback;

    if (scriptCallback.vt == VT_DISPATCH)

        spCallback = scriptCallback.pdispVal;

    IStream * istream;

    HRESULT hr = CoMarshalInterThreadInterfaceInStream(IID_NULL,spCallback,&istream);//手动列集

    if(SUCCEEDED(hr))

    {

        threadParams *params = new threadParams;

        params->v1 = v1;

        params->v2 = v2;

        params->istream = istream;

        _beginthread(ThreadFN, 0,(void *)params );

    }

    return S_OK;

}