当在项目中插入ActiveX控件ClassWizard生成的CWnd的派生类C++类中,可以看到其成员函数的代码中都有对InvokeHelper函数的调用,InvokeHelper函数的第一个参数都和对应的属性或方法在ActiveX控件中的分发(dispatch)ID(标识ActiveX控件的方法或属性的)相对应。通过查看ActiveX控件hlp文件可以发现,ActiveX控件的方法在生存的C++类中都有同名的成员函数与之对应,ActiveX控件的属性都有一组Get和Set函数对其操作,其中ActiveX控件的方法和属性操作与生成的C++类成员函数相关联都是通过InvokeHelper函数的调用来完成的,InvokeHelper函数的第一个参数是由Component Gallery(控件提供者)提供的。因为经过这样的处理,所以我们如果要调用ActiveX控件的方法或对其属性进行取和设置操作,只需调用生成的C++类对应的成员函数便可。
下面对InvokeHelper单独说明:
CWnd::InvokeHelper
void InvokeHelper( DISPID dwDispID, WORD wFlags, VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ... );
说明:
Call this member function to invoke the OLE control method or property specified by dwDispID, in the context specified by wFlags.
翻译:调用这个成员函数的目的是,通过dwDispID来指定调用的OLE控制方法和属性,用wFlags来说明上下文。具体的讲,其实就是通过dwDispID进行关联ActiveX控件的提供的接口(或称为对外方法、函数)和属性、事件等。
其中参数:
dwDispID:
Identifies the method or property to be invoked. This value is usually supplied by Component Gallery.
翻译:定义被调用的方法或属性。这个值通常是提供的组件库的指定的关联编号。
wFlags:可以为下面些值,指明调用InvokeHelper的目的。
[ DISPATCH_METHOD ] The member is invoked as a method. If a property has the same name, both this and the DISPATCH_PROPERTYGET flag may be set.
[ DISPATCH_PROPERTYGET] The member is retrieved as a property or data member.
[ DISPATCH_PROPERTYPUT] The member is changed as a property or data member.
[ DISPATCH_PROPERTYPUTREF] The member is changed by a reference assignment, rather than a value assignment. This flag is valid only when the property accepts a reference to an object.
翻译:
[ DISPATCH_METHOD] 成员作为一个方法被调用。如果属性有相同的名称, 这个和 [DISPATCH_PROPERTYGET]标记都可以设置。
[ DISPATCH_PROPERTYGET] 检索的成员属性或数据成员。
[ DISPATCH_PROPERTYPUT] 变值的成员属性或者数据成员。
[ DISPATCH_PROPERTYPUTREF] 成员通过引用赋值发生改变, 而不仅仅是个赋值。只有当属性接受一个对象的引用时这个标志是有效的。
vtRet:
Specifies the type of the return value.指定类型的返回值
VT_EMPTY void
VT_I2 short
VT_I4 long
VT_R4 float
VT_R8 double
VT_CY CY
VT_DATE DATE
VT_BSTR BSTR
VT_DISPATCH LPDISPATCH
VT_ERROR SCODE
VT_BOOL BOOL
VT_VARIANT VARIANT
VT_UNKNOWN LPUNKNOWN
pvRet:
Address of the variable that will that will receive the property value or return value. It must match the type specified by vtRet.
翻译:地址的变量,该变量将接收属性值或返回值。它必须匹配指定的类型vtRet
pbParamInfo:一般都设置为NULL
Pointer to a null-terminated string of bytes specifying the types of the parameters following pbParamInfo.
specifies the types of the parameters passed to the method or property.
指定类型的参数传递给方法或属性
Variable List of parameters, of types specified in pbParamInfo.
可变的参数列表,pbParamInfo中指定的类型
+++++++++++++++++++++++++题外话的分割线+++++++++++++++++++++++++++++++++++++++++
其实我不知道这个讲的是神马,但素,师父给我讲了关于指针的故事。记下来记下来。
pbParamInfo是个指针,但是却指向了一个空的地址。就是调用了空地址上面的方法。
系统找不到所以就会出错。
举个小栗子:
class Test {
void add();
}
Test* a = new Test();
a->add();
这样是正确的。
但如果Test* b;
b->add();
这样就会出错。
因为:b是一个指针,但是却没有指向一段内存,我们再去调用它的方法,自然会出错以后遇到指针,一定要先初始化,再用。
+++++++++++++++++++++++++++++++++题外话技术的分割线++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++进入正题的分割线++++++++++++++++++++++++++++++++
1、播放文件的函数:
void CActiveMovie3::Run() { InvokeHelper(0x60020001, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); }
2、暂停播放的函数:
void CActiveMovie3::Pause() { InvokeHelper(0x60020002, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); }
4、停止播放的函数:
void CActiveMovie3::Stop() { InvokeHelper(0x60020003, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); }
5、获得文件的函数:
CString CActiveMovie3::GetFileName() { CString result; InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; }
6、设置文件的函数:
void CActiveMovie3::SetFileName(LPCTSTR lpszNewValue) { static BYTE parms[] = VTS_BSTR; InvokeHelper(0xb, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, lpszNewValue); }
7、获得播放位置的函数:
double CActiveMovie3::GetCurrentPosition() { double result; InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_R8, (void*)&result, NULL); return result; }
8、设置播放位置的函数:
void CActiveMovie3::SetCurrentPosition(double newValue) { static BYTE parms[] = VTS_R8; InvokeHelper(0xd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); }
9、获得音量的函数:
long CActiveMovie3::GetVolume() { long result; InvokeHelper(0x13, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; }
10、设置音量的函数:
void CActiveMovie3::SetVolume(long nNewValue) { static BYTE parms[] = VTS_I4; InvokeHelper(0x13, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, nNewValue); }
11、设置自动开始播放的函数:
void CActiveMovie3::SetAutoStart(BOOL bNewValue) { static BYTE parms[] = VTS_BOOL; InvokeHelper(0x28, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, bNewValue); }