mfc activeX 接口为默认参数(可选)的设置----VARIANT:DISPATCH、VT_DISPATCH类型的取值

c++中,可选参数,eg:  
int Fun(char* a="aaa", int b=333);  
3种调用都可以:Fun()、Fun("bbb")、Fun("bbb", 444);
注意:
1. 可选参数须在函数参数的最右边,调用时不能跨可选参数调用,即Fun(444)不可以。
2. 类,头文件申明了可选参数(即变量赋值),实现文件函数参数可不必写变量赋值,
  即头文件申明int fun(int a=3);实现文件int fun(int a) {printf--a=3};
 
mfc做的activeX控件,网页调用可选参数的函数,现说下我的解决方法:
该可选参数,类型必须申明为VATIANT类型,具体如下:
    <1> idl文件中:[id(2)] LONG Fun([optional]VARIANT a, [optional]VARIANT b);
    <2> 头文件中:LONG FUN(VATIANT &a, VATIANT &b);
    <3> 实现文件中: 
            1. DISP_FUNCTION_ID(CXXCtrl, "Fun", dispidFun, Fun, VT_I4, VTS_VARIANT VTS_VARIANT)
   2. 见如下代码:

LONG CXXCtrl::Fun(VATIANT &a, VATIANT &b)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CString csTemp;
	if (a.vt == VT_DISPATCH) //这个类型困扰我多时,不了解,网上资料也很少,经长时间探索和测试,得出此方法可行
	{
		MessageBox("VT_DISPATCH");
		IDispatch *varCon =  a.pdispVal;
		VARIANT varResult = {0};
		DISPPARAMS params = {NULL, NULL, 0, 0};
		varCon->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, ¶ms, &varResult, NULL, NULL);
		csTemp = varResult.bstrVal;
		MessageBox(csTemp);
	}
	else if (a.vt == VT_BSTR)
	{
		MessageBox("VT_BSTR");
		csTemp = a.bstrVal;
		MessageBox(csTemp);
	}
	else
	{
		//...
	}
	//................
}

参考文档或链接:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms221479(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/aa705925(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/cc237569.aspx

http://www.cnblogs.com/jzxx/p/5521026.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值