1. 程式人生 > >從ATL中返回字串陣列到JavaScript的示例

從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