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

推荐订阅源

www.infosecurity-magazine.com
www.infosecurity-magazine.com
D
DataBreaches.Net
T
Tailwind CSS Blog
M
MIT News - Artificial intelligence
Stack Overflow Blog
Stack Overflow Blog
F
Full Disclosure
V2EX - 技术
V2EX - 技术
N
News and Events Feed by Topic
Help Net Security
Help Net Security
L
LangChain Blog
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
Google Online Security Blog
Google Online Security Blog
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
B
Blog RSS Feed
N
Netflix TechBlog - Medium
N
News | PayPal Newsroom
TaoSecurity Blog
TaoSecurity Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Vulnerabilities – Threatpost
B
Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
AI
AI
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyberwarzone
Cyberwarzone
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
G
GRAHAM CLULEY
Vercel News
Vercel News
罗磊的独立博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
博客园 - 司徒正美
C
CERT Recently Published Vulnerability Notes
GbyAI
GbyAI
Scott Helme
Scott Helme
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
A
About on SuperTechFans
P
Privacy International News Feed

博客园 - 吴碧宇

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;

}