张志松
记录工作点滴,留下人生轨迹。(zezese@163.com)
posts - 68,  comments - 11,  trackbacks - 0

如果您正在从 C 或 C++ 客户端调用该方法,则需要做更多工作才能打包调用。 如果您正在从 MFC 客户端应用程序调用该函数,并且使用了 ClassWizard 来为包含 MyFunc1 的自动功能对象生成参数包装类,那么,ClassWizard 将不会对 MyFunc1 或其它任何采用可变长参数列表的函数生成一个 wrapper (包装) 函数。 这是因为 MFC 实现 ColeDispatchDriver 时, 它并不知道如何对 SAFEARRAY 类型进行打包。这不是 Bug,而只是 MFC 的局限。 因此,如果使用 ClassWizard 来生成参数包装类用于自动对象,该自动对象包含带有变长参数列表的方法,那么,您必须编写参数包装程序才能调用该函数。

下面的 Visual C++ 函数显示了如何调用 MyFunc1 自动功能方法:
CString _Class1::InvokeMyFunc1(long p1,VARIANT *pVar,int cElems)
{
//pVar is an array of variants.
//cElems is the number of variants in pVar.
//p1 is a required long parameter.
HRESULT hr;
VARIANT returnval;
EXCEPINFO Excepinfo;
unsigned int uArgErr;
DISPPARAMS dp;
VariantInit(&returnval);
//Create the rgvarg member of the DISPPARAMS struct.
//Make it big enough to hold the number of VARIANTS in the
//pVar array + an extra variant to hold the required parameter.
dp.rgvarg = new VARIANTARG[cElems+1];
//Because the variable length parameter list is the last argument
//to the function, it gets copied to dp.rgvarg first.
memcpy(dp.rgvarg,pVar,sizeof(VARIANT)*cElems);
//Add the required parameter (p1) to the array.
dp.rgvarg[cElems].vt = VT_I4;
dp.rgvarg[cElems].lVal = p1;
//Set cArgs to the total number of arguments passed.
dp.cArgs = cElems+1;
dp.cNamedArgs = 0;
//Make the call.
hr = m_lpDispatch->Invoke(0x6003001C,
IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD,
&dp,
&returnval,
&Excepinfo,&uArgErr);
//Delete the memory you allocated above for dp.rgvarg.
delete[] dp.rgvarg;
//Return the string as a Cstring.
CString strRet(returnval.bstrVal);
VariantClear(&returnval);
return strRet;
}
尽管 MyFunc1 函数的类型信息指定要将 SAFEARRAY* 传入,但调用者没有创建 SAFEARRAY 并将其传递给调用。 调用者在 DISPARAMS 结构中传递变量数组以及一个必需参数和全部参数的总数。 在服务器中实现该调用时,将创建 SAFEARRAY,并将传入的变量数组打包到 SAFEARRAY 中,然后将 SAFEARRAY 的指针传递给服务器的方法。 这样,创建 SAFEARRAY 以便传递 MyFunc1 的责任不再由调用者承担。 调用者需要将它希望传递的全部额外参数打包到一个简单数组中(该数组包含在 DISPARAMS 结构中),然后调用该方法。

还可以参考MFC源码:COleDispatchDriver::InvokeHelper和COleDispatchDriver::InvokeHelperV。

posted on 2010-12-11 14:34 张志松 阅读(440) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

转载

搜索

  •  

最新评论

阅读排行榜

评论排行榜