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

来源:互联网 发布:软件著作权 设计说明书 编辑:程序博客网 时间:2024/06/08 08:37

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


阅读全文
2 0
原创粉丝点击