测试环境: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