刺激战场
六合彩
贵宾厅
  • 1378阅读
  • 2回复

com-IDispatch示例 [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-03-09
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475void demo(){::CoInitialize( NULL );        // COM 初始化 CLSID clsid;                // 通过 ProgID 得到 CLSIDHRESULT hr = ::CLSIDFromProgID( L"Simple8.DispSimple.1", &clsid );ASSERT( SUCCEEDED( hr ) );    // 如果失败,说明没有注册组件 IDispatch * pDisp = NULL;    // 由 CLSID 启动组件,并得到 IDispatch 指针hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID *)&pDisp );ASSERT( SUCCEEDED( hr ) );    // 如果失败,说明没有初始化 COM LPOLESTR pwFunName = L"Add";    // 准备取得 Add 函数的序号 DispIDDISPID dispID;                    // 取得的序号,准备保存到这里hr = pDisp->GetIDsOfNames(        // 根据函数名,取得序号的函数IID_NULL,&pwFunName,                    // 函数名称的数组1,                            // 函数名称数组中的元素个数LOCALE_SYSTEM_DEFAULT,        // 使用系统默认的语言环境&dispID );                    // 返回值ASSERT( SUCCEEDED( hr ) );        // 如果失败,说明组件根本就没有 ADD 函数 VARIANTARG v[2];                    // 调用 Add(1,2) 函数所需要的参数v[0].vt = VT_I4;    v[0].lVal = 2;    // 第二个参数,整数2v[1].vt = VT_I4;    v[1].lVal = 1;    // 第一个参数,整数1 DISPPARAMS dispParams = { v, NULL, 2, 0 };    // 把参数包装在这个结构中VARIANT vResult;            // 函数返回的计算结果 hr = pDisp->Invoke(            // 调用函数dispID,                    // 函数由 dispID 指定IID_NULL,LOCALE_SYSTEM_DEFAULT,    // 使用系统默认的语言环境DISPATCH_METHOD,        // 调用的是方法,不是属性&dispParams,            // 参数&vResult,                // 返回值NULL,                    // 不考虑异常处理NULL);                    // 不考虑错误处理ASSERT( SUCCEEDED( hr ) );    // 如果失败,说明参数传递错误 CString str;            // 显示一下结果str.Format("1 + 2 = %d", vResult.lVal );AfxMessageBox( str ); pDisp->Release();        // 释放接口指针::CoUninitialize();        // 释放 COM}示例二、CComDispatchDriver 智能指针包装类的使用方法 void demo(){// 已经进行过了 COM 初始化 CLSID clsid;                // 通过 ProgID 取得组件的 CLSIDHRESULT hr = ::CLSIDFromProgID( L"Simple8.DispSimple.1", &clsid );ASSERT( SUCCEEDED( hr ) );    // 如果失败,说明没有注册组件 CComPtr < IUnknown > spUnk;    // 由 CLSID 启动组件,并取得 IUnknown 指针hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IUnknown, (LPVOID *)&spUnk );ASSERT( SUCCEEDED( hr ) ); CComDispatchDriver spDisp( spUnk );    // 构造只能指针CComVariant v1(1), v2(2), vResult;    // 参数hr = spDisp.Invoke2(    // 调用2个参数的函数L"Add",                // 函数名是 Add&v1,                // 第一个参数,值为整数1&v2,                // 第二个参数,值为整数2&vResult);            // 返回值ASSERT( SUCCEEDED( hr ) );    // 如果失败,说明或者没有 ADD 函数,或者参数错误 CString str;            // 显示一下结果str.Format("1 + 2 = %d", vResult.lVal );AfxMessageBox( str );}示例


善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
离线qq1156136807

只看该作者 板凳  发表于: 2017-12-29
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个