COM接口:/* 返回字符串数组 */
HRESULT GetArray( [out,retval] VARIANT* pArray );
在网页上测试,用javascript实现。
网上的例子有两种说法,一种是用VBArray转换,一种是用ActiveXObject。但我都没试用成功。
希望大家帮下忙,给个完整的例子。万分感激!
HRESULT GetArray( [out,retval] VARIANT* pArray );
在网页上测试,用javascript实现。
网上的例子有两种说法,一种是用VBArray转换,一种是用ActiveXObject。但我都没试用成功。
希望大家帮下忙,给个完整的例子。万分感激!
JS调用C++,通过设置DIID_HTMLDocumentEvents事件,来捕获HTMLWINDOW上的事件,再通过事件对象的get_srcElement得到事件源,从而得到指定元素对象,从而获取元素的信息得到脚本传过来的数据,来进行调用
我以前从没接触过javascript,所以能不能给出个示例代码?
function GetNetWorkAddresses()
Dim IPArray
IPArray = CXXX.GetNetWorkAddresses( true, true ) Dim IPList
Dim index
for index = LBound( IPArray ) To UBound( IPArray )
IPList = IPList + IPArray( index ) + ";"
Next
document.GetElementById( "IPList" ).value = IPList
end function
</script>
在COM中通过事件来传递字符串数组。STDMETHODIMP CTestArray::SetEvent(void)
{
// 1. 获取SAFEARRAY( SAFEARRAY* psa )
for ( ... ... )
{
/* 注意此处是通过VARIANT数据进行赋值 */
VARIANT var;
VariantInit( &var );
V_VT( &var ) = VT_BSTR;
...
SafeArrayPutElement( psa, &index, &var );
...
}
// 2. 通过事件传递字符串数组
this->Fire_OnEvent( &psa )
// 3. 回收内存,返回S_OK
} 在javascript代码中,通过接收事件接收字符串数组:<object id="test" classid="..." codebase="...">
</object><form>
<p> <input id="btnGetStrings" name="Submit" type="button" value="Strings" onclick="GetStrings()">
<input id="strings" type="text" value="">
</p>
</form>
<script language="javascript">
function GetStrings()
{
test.SetEvent();
};
</script>
<script language="javascript" for="test" event="OnEvent(parray)">
var MyArray = new VBArray( parray ).toArray();
document.getElementById( "strings" ).value = MyArray.toString();
</script>
其中需要注意的地方:
1、这个方法对于除BSTR外其他的数据类型是否有效,我没有试过。
2、需要将Fire_OnEvent中处理此数组的地方修改一下:
将
avarParams[0] = parray;
改成以下形式:
avarParams[0].vt = VT_ARRAY | VT_BYREF | VT_VARIANT;
avarParams[0].pparray = parray;
3、在此过程中,某些地方是VT_VARIANT,而不是VT_BSTR,在这些地方一定要注意。包括:
(1) 调用SafeArrayCreate创建安全数组时
(2) 在事件函数Fire_OnEvent中
而在SetEvent接口函数的for循环中,var的类型是VT_BSTR。