此文参考了http://blog.csdn.net/playstudy/article/details/8259737,在此基础上做了改进

// WebDlg.idl : WebDlg 的 IDL 源

//

// 此文件将由 MIDL 工具处理以

// 产生类型库(WebDlg.tlb)和封送处理代码。

#include "olectl.h"

import "oaidl.idl";

import "ocidl.idl";

[

object,

uuid(1DC366A1-3040-4376-B4CD-26B0E7032641),

dual,

nonextensible,

pointer_default(unique)

]

interface IGetJavaScriptArray : IDispatch

{

[id(1)] HRESULT getArrayValue2D([in] VARIANT arrayPoints, [out,retval] LONG *result);

};

[

uuid(9C070B0B-F506-44C6-8163-CC9C502B12A3),

version(1.0),

]

library WebDlgLib

{

importlib("stdole2.tlb");

[

uuid(E5466677-5CF1-4870-98EA-01E9C4A198DF),

control

]

coclass GetJavaScriptArray

{

[default] interface IGetJavaScriptArray;

};

};

// GetJavaScriptArray.h : CGetJavaScriptArray 的声明

#pragma once

#include "resource.h"       // 主符号

#include

#include "WebDlg_i.h"

#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)

#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"

#endif

using namespace ATL;

// CGetJavaScriptArray

class ATL_NO_VTABLE CGetJavaScriptArray :

public CComObjectRootEx,

public IDispatchImpl,

public IOleControlImpl,

public IOleObjectImpl,

public IOleInPlaceActiveObjectImpl,

public IViewObjectExImpl,

public IOleInPlaceObjectWindowlessImpl,

public ISupportErrorInfo,

public IQuickActivateImpl,

#ifndef _WIN32_WCE

public IDataObjectImpl,

#endif

public IProvideClassInfo2Impl,

public CComCoClass,

public CComControl

{

public:

CGetJavaScriptArray()

{

}

DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |

OLEMISC_CANTLINKINSIDE |

OLEMISC_INSIDEOUT |

OLEMISC_ACTIVATEWHENVISIBLE |

OLEMISC_SETCLIENTSITEFIRST

)

DECLARE_REGISTRY_RESOURCEID(IDR_GETJAVASCRIPTARRAY)

BEGIN_COM_MAP(CGetJavaScriptArray)

COM_INTERFACE_ENTRY(IGetJavaScriptArray)

COM_INTERFACE_ENTRY(IDispatch)

COM_INTERFACE_ENTRY(IViewObjectEx)

COM_INTERFACE_ENTRY(IViewObject2)

COM_INTERFACE_ENTRY(IViewObject)

COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)

COM_INTERFACE_ENTRY(IOleInPlaceObject)

COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)

COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)

COM_INTERFACE_ENTRY(IOleControl)

COM_INTERFACE_ENTRY(IOleObject)

COM_INTERFACE_ENTRY(ISupportErrorInfo)

COM_INTERFACE_ENTRY(IQuickActivate)

#ifndef _WIN32_WCE

COM_INTERFACE_ENTRY(IDataObject)

#endif

COM_INTERFACE_ENTRY(IProvideClassInfo)

COM_INTERFACE_ENTRY(IProvideClassInfo2)

END_COM_MAP()

BEGIN_PROP_MAP(CGetJavaScriptArray)

PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)

PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)

// 示例项

// PROP_ENTRY_TYPE("属性名", dispid, clsid, vtType)

// PROP_PAGE(CLSID_StockColorPage)

END_PROP_MAP()

BEGIN_MSG_MAP(CGetJavaScriptArray)

CHAIN_MSG_MAP(CComControl)

DEFAULT_REFLECTION_HANDLER()

END_MSG_MAP()

// 处理程序原型:

//  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

//  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);

//  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);

// ISupportsErrorInfo

STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)

{

static const IID* const arr[] =

{

&IID_IGetJavaScriptArray,

};

for (int i=0; i

{

if (InlineIsEqualGUID(*arr[i], riid))

return S_OK;

}

return S_FALSE;

}

// IViewObjectEx

DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

// IGetJavaScriptArray

public:

HRESULT OnDraw(ATL_DRAWINFO& di)

{

RECT& rc = *(RECT*)di.prcBounds;

// 将剪辑区域设置为 di.prcBounds 指定的矩形

HRGN hRgnOld = NULL;

if (GetClipRgn(di.hdcDraw, hRgnOld) != 1)

hRgnOld = NULL;

bool bSelectOldRgn = false;

HRGN hRgnNew = CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);

if (hRgnNew != NULL)

{

bSelectOldRgn = (SelectClipRgn(di.hdcDraw, hRgnNew) != ERROR);

}

Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);

SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);

LPCTSTR pszText = _T("GetJavaScriptArray");

#ifndef _WIN32_WCE

TextOut(di.hdcDraw,

(rc.left + rc.right) / 2,

(rc.top + rc.bottom) / 2,

pszText,

lstrlen(pszText));

#else

ExtTextOut(di.hdcDraw,

(rc.left + rc.right) / 2,

(rc.top + rc.bottom) / 2,

ETO_OPAQUE,

NULL,

pszText,

ATL::lstrlen(pszText),

NULL);

#endif

if (bSelectOldRgn)

SelectClipRgn(di.hdcDraw, hRgnOld);

return S_OK;

}

DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()

{

return S_OK;

}

void FinalRelease()

{

}

STDMETHOD(getArrayValue2D)(VARIANT arrayPoints, LONG *result);

HRESULT getArrayLength1D(IDispatch *pDisp, int *pLength);

HRESULT getArrayNumberOfIndex1D(IDispatch *pDisp, int index, int *pValue);

HRESULT setArrayNumberOfIndex1D(IDispatch *pDisp, int index, int value);

HRESULT getArrayLength2D(IDispatch *pDisp, int *pLength1, int *pLength2);

HRESULT getArrayNumberOfIndex2D(IDispatch *pDisp, int index1, int index2, int *pValue);

};

OBJECT_ENTRY_AUTO(__uuidof(GetJavaScriptArray), CGetJavaScriptArray)

// GetJavaScriptArray.cpp : CGetJavaScriptArray 的实现

#include "stdafx.h"

#include "GetJavaScriptArray.h"

#include

using namespace ATL;

// CGetJavaScriptArray

STDMETHODIMP CGetJavaScriptArray::getArrayValue2D(VARIANT arrayPoints, LONG *result)

{

if(arrayPoints.vt != VT_DISPATCH){*result = 0; return S_FALSE;} //数据类型不是VT_DISPATCH

int len1 = 0;

int len2 = 0;

HRESULT hr = getArrayLength2D(arrayPoints.pdispVal, &len1, &len2);

if(FAILED(hr)){*result = 0; return S_FALSE;}

//----------------------------------------

CString str = _T("CGetJavaScriptArray::getArrayValue2D():\n");

for(long i = 0; i < len1; i++)

{

for(long j = 0; j < len2; j++)

{

int value = -1;

getArrayNumberOfIndex2D(arrayPoints.pdispVal, i, j, &value);

CString str_temp = _T("");

str_temp.Format(_T("a[%d,%d]=%d\n"), i, j, value);

str += str_temp;

}

}

//----------------------------------------

this->MessageBoxW(str, _T("ActiveX获取JavaScript传递的二维数组"), MB_OK);

*result = 1;

return S_OK;

}

//获取Javascript数组长度

HRESULT CGetJavaScriptArray::getArrayLength1D(IDispatch *pDisp, int *pLength)

{

BSTR varName = L"length";

VARIANT varValue;

DISPPARAMS noArgs = {NULL, NULL, 0, 0};

DISPID dispId;

HRESULT hr = 0;

*pLength = 0;

hr = pDisp->GetIDsOfNames(IID_NULL, &varName, 1, LOCALE_USER_DEFAULT, &dispId);

if (FAILED(hr)){return hr;}

hr = pDisp->Invoke(dispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &noArgs, &varValue, NULL, NULL);

if(SUCCEEDED(hr))

{

*pLength = varValue.intVal;

}

return hr;

}

//获取Javascript数组中指定位置的整数元素值

HRESULT CGetJavaScriptArray::getArrayNumberOfIndex1D(IDispatch *pDisp, int index, int *pValue)

{

CComVariant varName(index, VT_I4); //数组下标

DISPPARAMS noArgs = {NULL, NULL, 0, 0};

DISPID dispId;

VARIANT varValue;

HRESULT hr = 0;

varName.ChangeType(VT_BSTR); //将数组下标转为数字型,以进行GetIDsOfNames

hr = pDisp->GetIDsOfNames(IID_NULL, &varName.bstrVal, 1, LOCALE_USER_DEFAULT, &dispId); //获取通过下标访问数组的过程,将过程名保存在dispId中

if(FAILED(hr)){return hr;}

hr = pDisp->Invoke(dispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &noArgs, &varValue, NULL, NULL); //调用COM过程,访问指定下标数组元素,根据dispId 将元素值保存在varValue中

if(SUCCEEDED(hr))

{

*pValue = varValue.intVal; //将数组元素按int类型取出

}

return hr;

}

// 设置Javascript数组中指定位置的整数元素值

HRESULT CGetJavaScriptArray::setArrayNumberOfIndex1D(IDispatch *pDisp, int index, int value)

{

CComVariant varName(index, VT_I4);

DISPID dispId;

CComVariant varValue;

HRESULT hr = 0;

varName.ChangeType(VT_BSTR); // 将数组下标转为数字型,以进行GetIDsOfNames

hr = pDisp->GetIDsOfNames(IID_NULL, &varName.bstrVal, 1, LOCALE_USER_DEFAULT, &dispId);

if (FAILED(hr)){return hr;}

DISPID dispidPut = DISPID_PROPERTYPUT; //put操作

DISPPARAMS dispparams;

dispparams.rgvarg = new VARIANTARG[1]; //初始化rgvarg

dispparams.rgvarg[0].vt = VT_I4; //数据类型

dispparams.rgvarg[0].intVal = value; //更新值

dispparams.cArgs = 1; //参数数量

dispparams.cNamedArgs = 1; //参数名称

dispparams.rgdispidNamedArgs = &dispidPut; //操作DispId,表明本参数适用于put操作

hr = pDisp->Invoke(dispId, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL);

return hr;

}

//获取Javascript数组长度

HRESULT CGetJavaScriptArray::getArrayLength2D(IDispatch *pDisp, int *pLength1, int *pLength2)

{

BSTR varName = L"length";

VARIANT varValue;

DISPPARAMS noArgs = {NULL, NULL, 0, 0};

DISPID dispId;

HRESULT hr = 0;

*pLength1 = 0;

*pLength2 = 0;

hr = pDisp->GetIDsOfNames(IID_NULL, &varName, 1, LOCALE_USER_DEFAULT, &dispId);

if (FAILED(hr)){return hr;}

hr = pDisp->Invoke(dispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &noArgs, &varValue, NULL, NULL);

if(SUCCEEDED(hr)){*pLength1 = varValue.intVal;}

//---------获取第二维长度-----------------------

if(*pLength1 > 0)

{

CComVariant varNameIndex(0, VT_I4); //数组下标

varNameIndex.ChangeType(VT_BSTR); //将数组下标转为数字型,以进行GetIDsOfNames

DISPID dispId2;

VARIANT varValue2;

hr = pDisp->GetIDsOfNames(IID_NULL, &varNameIndex.bstrVal, 1, LOCALE_USER_DEFAULT, &dispId2); //获取通过下标访问数组的过程,将过程名保存在dispId中

if(FAILED(hr)){return hr;}

hr = pDisp->Invoke(dispId2, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &noArgs, &varValue2, NULL, NULL); //调用COM过程,访问指定下标数组元素,根据dispId 将元素值保存在varValue中

if(FAILED(hr)){return hr;}

if(varValue2.vt != VT_DISPATCH){return S_FALSE;}

IDispatch *pDisp2 = varValue2.pdispVal;

VARIANT varValue3;

DISPPARAMS noArgs = {NULL, NULL, 0, 0};

DISPID dispId3;

hr = pDisp2->GetIDsOfNames(IID_NULL, &varName, 1, LOCALE_USER_DEFAULT, &dispId3);

if(FAILED(hr)){return hr;}

hr = pDisp2->Invoke(dispId3, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &noArgs, &varValue3, NULL, NULL);

if(SUCCEEDED(hr)){*pLength2 = varValue3.intVal;}

}else

{

return S_FALSE;

}

return hr;

}

//获取Javascript数组中指定位置的整数元素值

HRESULT CGetJavaScriptArray::getArrayNumberOfIndex2D(IDispatch *pDisp, int index1, int index2, int *pValue)

{

CComVariant varNameIndex1(index1, VT_I4);

CComVariant varNameIndex2(index2, VT_I4);

DISPPARAMS noArgs1 = {NULL, NULL, 0, 0};

DISPID dispId1;

DISPID dispId2;

CComVariant varValue1;

CComVariant varValue2;

HRESULT hr = 0;

varNameIndex1.ChangeType(VT_BSTR); //将数组下标转为数字型,以进行GetIDsOfNames

varNameIndex2.ChangeType(VT_BSTR); //将数组下标转为数字型,以进行GetIDsOfNames

hr = pDisp->GetIDsOfNames(IID_NULL, &varNameIndex1.bstrVal, 1, LOCALE_USER_DEFAULT, &dispId1);

if (FAILED(hr)){return hr;}

hr = pDisp->Invoke(dispId1, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &noArgs1, &varValue1, NULL, NULL); //调用COM过程,访问指定下标数组元素,根据dispId 将元素值保存在varValue中

if(FAILED(hr)){return hr;}

if(varValue1.vt != VT_DISPATCH){return S_FALSE;} //varValue2.vt为第二维

//--------------------------------------------

IDispatch *pDisp2 = varValue1.pdispVal;

hr = pDisp2->GetIDsOfNames(IID_NULL, &varNameIndex2.bstrVal, 1, LOCALE_USER_DEFAULT, &dispId2);

if (FAILED(hr)){return hr;}

hr = pDisp2->Invoke(dispId2, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &noArgs1, &varValue2, NULL, NULL); //调用COM过程,访问指定下标数组元素,根据dispId 将元素值保存在varValue中

if(FAILED(hr)){return hr;}

*pValue = varValue2.intVal;

return S_OK;

}

对象 GetJavaScriptArray 的 ATL 8.0 测试页

function test()

{

var points = [[175, 42], [289, 72], [216, 64], [301, 131]];

var result = GetJavaScriptArray.getArrayValue2D(points); //将javascript二维数组传递到ActiveX控件中

}

运行结果:

js二维数组传递java,ActiveX获取JavaScript传递的二维数组相关推荐

  1. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( Java 层获取 Surface | 传递画布到本地 | 创建 ANativeWindow )

    文章目录 I . FFMPEG ANativeWindow 原生绘制 II . FFMPEG 原生绘制流程 III . Java 层获取 Surface 画布 IV . 传递 Surface 画布到 ...

  2. Java用数组的包文件_在Java中获取包内的类文件数组

    我能够使用普通的文件I / O和搜索机制来解决这个问题.您可以在此处查看答案. private static List getClassesForPackage(Package pkg) { Stri ...

  3. Java后台获取前端传递的日期解析不了

    解决方案:1,如果是通过实体类接收日期参数,则在实体类中日期字段添加注解,如下 @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @Co ...

  4. php接收get数组参数吗,php获取到data参数,如何与数组匹配

    1.html: 推荐 全国各族人民发来贺电 2.js: $('.new-title-info-btn').mouseenter( function(){ var key=$(this).attr('c ...

  5. 聊聊高并发(二十)解析java.util.concurrent各个组件(二) 12个原子变量相关类

    这篇说说java.util.concurrent.atomic包里的类,总共12个,网上有很多文章解析这几个类,这里挑些重点说说. 这12个类可以分为三组: 1. 普通类型的原子变量 2. 数组类型的 ...

  6. js 数组 改变长度_比较JavaScript中的数据结构(数组与对象)

    文末送5本书 在编程中,如果你想继续深入,数据结构是我们必须要懂的一块, 学习/理解数据结构的动机可能会有所不同,一方面可能是为了面试,一方面可能单单是为了提高自己的技能或者是项目需要.无论动机是什么 ...

  7. # Java 并发编程的艺术(二)

    Java 并发编程的艺术(二) 文章目录 Java 并发编程的艺术(二) 并发编程的挑战 上下文切换 如何减少上下文的切换 死锁 资源限制的挑战 Java 并发机制的底层实现原理 volatile 的 ...

  8. java rhino 运行 js_使用Rhino在Java中调用Javascript脚本

    转自:http://www.iteye.com/topic/87423 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式. 结果方案五花八门: 1.jakarta com ...

  9. pythonjson构建二维数组_python后台获取ajax传递的二维数组,保持原有数据结构不变...

    python后台获取ajax传递的二维数组,保持原有数据结构不变. 前台主要程序: arr_data = [[1,2,3],[4,5,6]];//创建二维数组 var json_data = JSON ...

最新文章

  1. 随机存取:fseek(),ftell()
  2. [bzoj2213][Poi2011]Difference_动态规划
  3. 现代密码学2.2、2.3--由“一次一密”引出具有完美安全的密码方案共同缺点
  4. SpringMVC从Controller跳转到另一个Controller
  5. Maven核心概念(转)
  6. 如何清除图片下方出现几像素的空白间隙?
  7. linux mount_nodev函数,mount()函数 Unix/Linux
  8. QT 按钮(4种样式)
  9. python之路day9_Python之路,Day7 - 面向对象编程进阶
  10. BZOJ 1050 [HAOI2006]旅行comf(最小生成树)
  11. win7记事本如何转换html,win7记事本程序在哪里 64位win7记事本程序怎么安装
  12. 制造企业使用APS计划排产需要的条件
  13. 腾讯AI开放平台使用尝试:账号开通/应用创建/能力开通
  14. 高数笔记基础篇(更完)
  15. 门急诊排队叫号系统demo的基本实现
  16. 如何快速将图片中的文字提取出来
  17. webqq 机器人 java_跨平台QQ客户端iQQ 根据WebQQ3.0协议Java开发
  18. clock_gettime获取系统时间
  19. 深度剖析钓鱼网站域名识别工具dnstwist
  20. C# 下 Webp格式转jpg格式详解

热门文章

  1. 在Linux中制作实用程序(MakeFile)
  2. 跟随者数字解码_跟随模式的数字
  3. 小程序 || 语句_C ++条件语句| 查找输出程序| 套装2
  4. php 判断 in,tinkphp常用判断条件in、notin、between、AND、OR
  5. sdr 软件_【火腿专题】购买软件定义无线电(SDR)还是传统无线电台?追求欲望无止境...
  6. 笔记本电脑处理器_高通提示低成本5G芯片更强大的笔记本电脑处理器
  7. 软件测试项目计划书总结,软件测试项目计划书.doc
  8. 直播软件自动化测试,基于SRS-Bench工具的直播平台性能测试
  9. ruby中!!_Ruby反向! 功能
  10. Java Formatter toString()方法与示例