对于c++ 调用 IDispatch 问题,用于com包含
单位有一个很早以前的 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;
}