idl文件,注意onevent1这里。
[plain] view plain copy
import "oaidl.idl"
import "ocidl.idl"
[
object,
uuid(6A6140E8-9356-4FBD-B0FD-04508D336B17),
dual,
nonextensible,
pointer_default(unique)
]
interface IComClassTest : IDispatch{
[id(1)] HRESULT Method1(BSTR arg1)
[propget, id(2), bindable, displaybind] HRESULT onevent1([out, retval] VARIANT* pVal)
[propput, id(2), bindable, displaybind] HRESULT onevent1([in] VARIANT newVal)
}
[
uuid(97157E1C-637C-4962-B069-96E70F572A99),
version(1.0),
]
library ATLProject3Lib
在javascript中先定义一个该COM的对象,然后用 var iResult = Com对象.sum(1, 2)这样iResult变量就会接到*pVal的值。但是要保证*pVal的类型是out的,而且必须是retval的,否则外面调用时是接不到的。COM组件通过 BSTR* 数据类型将一个字符串从接口方法内部返回给外部js的,如下接口方法: HRESULT GetFilePath([out,retval] BSTR* bstrFilePath)为COM组件中C++的标准形式,可以看到参数是指向BSTR类型的指针,而js是没有指针数据类型的。该方法经js调用后变为: var varFilePath = GetFilePath()即在外部做了转换,把C++的具有带出引用功能的形参bstrFilePath作为了返回值给了js,该参数就会将GetFilePath函数内部的路径字符串作为返回值返回给js。另外,在GetFilePath([out,retval] BSTR* bstrFilePath)实现时,不要用Getbuffer,而应该用AllocSysString函数,前者返回的只能在vc是正确的,到了js有时不正确(字符串有时会被截断)如:STDMETHODIMP CTest::GetFilePath(BSTR* bstrFilePath){AFX_MANAGE_STATE(AfxGetStaticModuleState())CString strFilePath = _T("c:\\1.TXT")