对于c++ 调用 IDispatch 问题,用于com包含

nicholascheung nicholascheung 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
单位有一个很早以前的 com 用于加密的
但是由于 是用的变体类型 不好,导致是用不方便
下面是定义
interface ICrypt : IDispatch {
[id(0x60020000)]
HRESULT OnStartPage([in] IUnknown* piUnk);
[id(0x60020001)]
HRESULT OnEndPage();
[id(0x00000001), helpstring("method PwdEncode")]
HRESULT PwdEncode(
[in, out] VARIANT* aDst, /*输出加密后字符*/
[in] VARIANT* aSrc, /*需要加密的字符*/
[in] VARIANT* aKey, /*key*/
[out, retval] VARIANT* ret);/*加密后的状态*/

我打算写一个com封装一下.要返回加密后的字符串。把变体的类型写具体
打算把 [in, out] VARIANT* aDst 改成 返回值
把[in] VARIANT* aKey 改成具体的LONG 其他的VARIANT改成BSTR 便于托管代码的调用。

问题是 执行的时候 hr 是成功的。但是 没有取到输出参数的值。
是不是VARIANTARG 没有指定输入参数? ? 一般的写法很少有不是函数返回值的输出参数。

下面是我写的代码 通过IDispatch调用


bool isSuccee=false; //执行成功标志
::CoInitialize( NULL ); // COM 初始化

CLSID clsid; // 通过 ProgID 得到 CLSID
HRESULT hr = ::CLSIDFromProgID( L"util.Crypt.1", &clsid );


IDispatch * pDisp = NULL; // 由 CLSID 启动组件,并得到 IDispatch 指针
hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID *)&pDisp );

LPOLESTR pwFunName = L"PwdEncode"; // 准备取得 Add 函数的序号 DispID
DISPID dispID; // 取得的序号,准备保存到这里
hr = pDisp->GetIDsOfNames( // 根据函数名,取得序号的函数
IID_NULL,
&pwFunName, // 函数名称的数组
1, // 函数名称数组中的元素个数
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
&dispID ); // 返回值
if(SUCCEEDED( hr ))
{
int a=0;
}
else
{
int a=1;
}
VARIANTARG v[3]; // 调用 所需要的参数
CComBSTR bstrVal=L"";
v[0].vt = VT_BSTR; v[0].bstrVal =bstrVal.Copy; // 第二个参数,整数2
v[1].vt = VT_BSTR; v[1].bstrVal = Source; // 第一个参数,整数1
v[2].vt = VT_INT; v[2].lVal = eKey; // 第一个参数,整数1

DISPPARAMS dispParams = { v, NULL, 3, 0 }; // 把参数包装在这个结构中
VARIANT vResult; // 函数返回的计算结果

hr = pDisp->Invoke( // 调用函数
dispID, // 函数由 dispID 指定
IID_NULL,
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
DISPATCH_METHOD, // 调用的是方法
&dispParams, // 参数
&vResult, // 返回值
NULL, // 不考虑异常处理
NULL); // 不考虑错误处理
if(FAILED( hr ))
{


}
else
{
isSuccee=true;
*retStr=v[0].bstrVal;
}

pDisp->Release(); // 释放接口指针
::CoUninitialize(); // 释放 COM
if(isSuccee=true)
{
return S_OK;
}
else
{
return S_FALSE;

}


...全文

相关推荐

WebBrowser中JS和C++代码互相调用

一个C++类,实现了IDispatch接口,提供供JS调用的方法。2. 注册脚本和安装程序,用于在用户的系统上注册COM对象。3. HTML页面,包含调用C++方法的JavaScript代码。4.

用户 昵称

基于R-CNN深度学习的无人机目标检测系统:数据集、模型和UI界面的完整实现

随着无人机技术的迅猛发展,无人机在军事、农业、环境监测等多个领域的应用日益广泛。无人机目标检测系统的建设成为提升无人机自主飞行和环境感知能力的重要环节。本文将详细介绍如何构建一个基于深度学习的无人机目标检测系统,采用R-CNN(区域卷积神经网络)算法,通过用户界面设计和数据集处理,实现高效的目标检测功能。通过本项目,旨在为无人机目标检测提供一种可行的解决方案,并提高其在复杂环境下的工作效率。R-CNN是一种流行的深度学习对象检测算法,主要通过提取图像特征来判断图像中的目标。

人工智能_SYBH

基于YOLO26深度学习框架的无人机航拍目标检测系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的无人机航拍目标检测系统。系统采用CSPDarknet53作为主干网络,结合特征金字塔和注意力机制,实现高效的目标检测。研究内容包括数据预处理、模型训练、目标分析和代码实现等环节,通过迁移学习和优化策略提升检测精度。该系统可应用于城市监测、农业巡检等领域,具有重要的理论价值和实际应用意义。

一键难忘

msword.zip

首先,`msword.h`是头文件,通常包含了函数声明和一些常量定义,是C++程序中用于调用MSWord功能的关键。

咸鸭蛋不好吃

基于ATL c++ com的简单例子

**COM接口**:COM组件通过接口与外界交互,每个接口由一组方法组成,这些方法遵循特定的调用约定。在ATL中,你可以使用`DECLARE_INTERFACE_`宏来声明接口。

LittleLittleFish_xyg
评论 8
收藏 已收藏
分享
返回顶部
nicholascheung
C++ 语言 65,214 成员 250,514 内容