mfc activeX 接口为默认参数(可选)的设置----VARIANT:DISPATCH、VT

xiaoxiao2021-02-28  100

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

转载请注明原文地址: https://www.6miu.com/read-36837.html

最新回复(0)