在Windows 7中通过VBA宏绕过System32/SysWOW64 javaw运行java。exe
有没有办法绕过由以下VBA代码“强制”的32位java版本(可能是在VBA中启动进程以调用64位版本cmd、关闭UAC或其他类型的tweek的另一种方式)(这只是一个假设,我在下面解释调试过程):
handleDbl = Shell("javaw -cp theJar.jar com.java.SampleClass", vbNormalFocus)
这里的要点是,我想分享我的宏,避免给接收者添加额外的指令,所以我尝试在代码上做所有事情(我在VBA代码上使用后期绑定,以避免手动设置引用之类的事情)
调试过程
抛出了一个错误,因此我使用了以下行:
handleDbl = Shell("cmd /k java -cp theJar.jar com.java.SampleClass", vbNormalFocus)
得到了错误Exception in thread "main" java.lang.UnsupportedClassVersionError: Unsupported major.minor version
,所以我检查了java -version
,试图找出运行的是哪个java:
C:\>where java
C:\Windows\System32\java.exe
C:\Program Files\Java\_anyJava.x.x.x_\bin\java.exe
我去了System32
文件夹,那里没有java,但我知道redirection从那里发生到C:\Windows\SysWOW64
,所以我将之前提取的java版本与C:\Windows\SysWOW64\java.exe -version
进行了比较,它们匹配
之后,我检查了我的Outlook版本,结果是32位安装。这是一个暗示,但主要是cmd旁边的那个和那个大的*32。任务管理器中的exe。我不知道64位Outlook是否会有所不同,或者是否会因为VBA实现而有所不同,但这就是我如何总结VBA的Shell函数导致32位java调用的原因
# 1 楼答案
通常有一个JAVA_HOME环境变量集。如果是这样的话,你可以这样做:
如果未设置,则必须在编译命令之前通过搜索找到它
# 2 楼答案
Sam的答案很好,但我只是对用户进行更多设置感到不安,所以我编写了一些函数来检查java的版本,并通知用户它是否在那里(无论如何,在这种情况下都必须安装java),所以下面是我的代码。它可能包含一些有用的东西