从ATL中返回字符串数组到JavaScript的示例

测试环境:VS2008 SP1 + WinXP SP3

测试时间:2012-5-11


ATL中的代码

STDMETHODIMP CSnapshot::GetFilesFromClipboard(VARIANT* retVal)
{
	std::list<std::wstring> listFiles = getFilesFromClipboard(NULL);
	std::list<std::wstring>::iterator iter = listFiles.begin();

	//初始化,待返回数组
	SAFEARRAYBOUND   pSab[1];//一维数组
	pSab[0].lLbound = 0; 
	pSab[0].cElements = listFiles.size();  //数组中元素的数量
	SAFEARRAY   *pSa; 
	pSa=SafeArrayCreate(VT_VARIANT,1,pSab);//创建一维数组

	//填数组
	LONG i = 0;
	while(iter!=listFiles.end())
	{
		VARIANT v;
		v.vt = VT_BSTR;
		v.bstrVal = ::SysAllocString( iter->c_str() ) ;
		SafeArrayPutElement(pSa,&i,&v);
		::SysFreeString(v.bstrVal);
		iter++,i++;
	}

	//返回数组
	retVal-> vt = VT_VARIANT|VT_ARRAY;
	retVal->parray = pSa; //pSa是生成的一个安全数组

	return S_OK;
}

VB中的测试代码

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim objTestATL As CWebsSnapshotLib.Snapshot
        Dim i As Integer
        Dim t As Array

        objTestATL = New CWebsSnapshotLib.Snapshot

        t = objTestATL.GetFilesFromClipboard()

        For i = 0 To t.Length - 1
            Debug.Print(i & ">>" & t(i))
        Next
    End Sub

JavaScript中的测试代码

<div id="txt">状态未定义</div>

.....这里省略若干行代码...

function goFilesFromClipboard()
{
    document.getElementById("txt").innerHTML = "返回数组:<br/>"
	var vba = CSnapshot.GetFilesFromClipboard();
	
	var jsa = vba.toArray(); //new VBArray(vba).toArray();
	for(i=0;i<jsa.length;i++){
	  document.getElementById("txt").innerHTML = document.getElementById("txt").innerHTML + "<br/>" +jsa[i];
	}	
}


注意:[Class View]窗口中,右键单击接口名称可以为这个接口添加方法和属性。

参考资料:

[1]《JavaScript与ActiveX之间传递数据 - 连载二》
http://leon-s-kennedy.iteye.com/blog/1545891
[2]《ATL控件如何获取网页中的参数》
http://blog.csdn.net/sunlab10987/article/details/3894187
[3]《ActiveX异步回调JavaScript》
http://blog.csdn.net/tingsking18/article/details/4278619
[4]《atl 标准控件在用多线程发消息时VC可以接收但网页无法接收的问题》
http://blog.csdn.net/zyc_sinacom/article/details/7427759

[5]javascript获取COM或ATL返回的数组(整型或字符串数组)VBArray相关
http://blog.sina.com.cn/s/blog_94e13967010129g4.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值