Java与VBA通讯实践

来源:互联网 发布:上海巨人网络校招 编辑:程序博客网 时间:2024/06/05 11:17
1. DDE(动态数据交换)方式
VBA具有DDE能力,Java没有。网上搜索了一下,有几个公司开发了这方面的类库,可以使Java具有DDE能力。
(1)JavaDDE - nevaobject:
http://www.nevaobject.com/_docs/_javadde/JavaDde.pdf
(2)WinPack - jniwrapper:
http://www.jniwrapper.com/pages/winpack/overview
两个类库号称都很强,但是都要求付费,就没怎么研究。玩了一下winpack的demo,几乎所有windows的工具,如察看硬盘,网络连接,用户管理等等,都可以用它的类库使用Java语言来包装。

2. Com Dll方式
这种方法理论上可以,但是Excel文件带着dll到处跑的话,总觉得不像话。
(1)Sun ActiveX Bridge - Sun提供的方法。具体参见下面网页。
http://java.sun.com/j2se/1.4.2/docs/guide/beans/axbridge/developerguide/index.html
简要用法:
-1. Write a java bean, and use java activex bridge to create dll.
CODE:  [Copy to clipboard]
C:/Program Files/Java/j2re1.4.2/axbridge/bin>C:/j2sdk1.4.2/bin/packager -clsid {D824B185-AE3C-11D6-ABF5-00B0D07B8581} -out . -reg F:/excelvba/excelvba.jar jp.co.esm.pmt.PMTBean
-2. Write the VBA in Excel.
(2)j-integra提供了两种解决方案。
前期绑定和后期绑定。后期绑定无需知道通讯的Java对象信息,将Java对象注册给虚拟机之后(使用j-integra工具),即可在运行时动态寻找到对象。
前期绑定速度比后期绑定快,但是要在编译之前注册JVM到VB工程。
前期绑定方法:http://j-integra.intrinsyc.com/support/com/doc/javafromcom/vb2javaeb.html
后期绑定方法:http://j-integra.intrinsyc.com/support/com/doc/javafromcom/vb2javalb.html
(3)微软的工具Microsoft SDK for Java
不过由于微软和sun的官司,在微软网站上已经无法下载这个工具了。
HomePage: http://www.microsoft.com/mscorp/java


3. Socket 通信
利用Socket通信,Java作为服务器端,VBA作为客户端。这种情况下,是不是java都没有关系了。
Java服务器端程序比较好写。关键是VBA客户端。
(1)使用Wsock控件当然是最简单的,但是我们的代码不能出现窗口,也就不能使用Wsock。而且我电脑上莫名其妙的不能使用Wsock,原因是未得到认证。不知为何。
(2)BASP21.DLL Socket Object:用这个Dll可以替代Wsock控件。但是最好不使用Dll。
http://www.hi-ho.ne.jp/babaq/eng/basp21s.html
(3)CSocketMaster 1.2 & CSocketPlus 1.1
VB模块,全代码,非控件,将模块导入VBA中即可。而且有详尽的例子,在VB上运行的非常好。但是在VBA中,导致Excel频频Crash,百思不得其解,不知为何。
比如其中有段代码:
CODE:  [Copy to clipboard]
Const MOD_VBA5 As String = "vba5"                           'Location of the EbMode function if running VB5
Const MOD_VBA6 As String = "vba6"                           'Location of the EbMode function if running VB6
  If Subclass_InIDE Then
    'Patch the jmp (EB0E) with two nop's (90) enabling the IDE breakpoint/stop checking code
    Call api_CopyMemory(ByVal nAddrSubclass + 12, &H9090, 2)
   
    i = Subclass_AddrFunc(MOD_VBA6, FUNC_EBM)               'Get the address of EbMode in vba6.dll
    If i = 0 Then                                           'Found?
      i = Subclass_AddrFunc(MOD_VBA5, FUNC_EBM)             'VB5 perhaps, try vba5.dll
    End If

    Debug.Assert i                                          'Ensure the EbMode function was found
    Call Subclass_PatchRel(PATCH_01, i)                     'Patch the relative address to the EbMode api function
不知道这个EbMode干吗用的,MSDN上也查不到有价值的东西。如果注释掉这段代码,会导致VB崩溃。

http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=54681&lngWId=1
(4)CSocket class - replacement for the MS Winsock Control
翻了一个晚上,终于找到了这个Module, 上面提到的CSocketMaster 也是根据这个改编的。
在VBA上使用了一下这个Module,比较流畅。
主页:http://www.vbip.com/winsock-api/csocket-class/csocket-class-01.asp
原创粉丝点击