令人困惑的是无法从Java程序中调用外部可执行文件

时间:2010-01-28 16:38:38

标签: java windows executable volume

好吧,我遇到了一个简单地混淆了我的bejeebus的错误。我正在寻找关于我可以调查什么的想法,因为现在,我一无所获。它是这样的:

我有一个独立的Java应用程序,偶尔需要改变它运行的计算机的Line-In卷(WinXP机器)。它通过调用一对可以获取和设置各种组件卷的外部可执行文件(用VB6 *编写)来实现。 (他们可以处理Line-In,Mic,Wave,CD和主音量控制。)

现场有数百台设备,运行在我公司提供和控制的硬件(戴尔机器)上。至少有几十个客户端正在使用此功能,并且它可以完美地工作 - 除了一个实例。

对于这台制造麻烦的机器,它根本不起作用。我在应用程序运行时观看音量滑块,当音量应该下降时,它们会保持不变。当我检查应用程序的日志文件时,它不会抛出任何错误,似乎正在执行丢弃卷的代码。当我从命令行运行可执行文件时,它们可以正常工作。

我不能保证这台机器与所有行为正常的机器完全相同,但我们已经购买同一系列的戴尔已经有一段时间了;至少,这是非常非常相似的。

所以,把我的困惑变成一个子弹列表:

  • 如果我在Java代码中做了一些愚蠢的事情(即,没有清除我的STDOUT / STDERR缓冲区),为什么它只是这台机器上的问题?
  • 如果VB6可执行文件中出现问题,为什么它们可以从命令行在本机上的其他所有机器上工作?
  • 如果这台机器上存在某种硬件奇怪现象,那么从Java应用程序中调用时,哪种奇怪的行为可能导致音量控制可执行文件 失败?

我很困惑。我不喜欢被困惑。有人有任何建议可能会导致我的启蒙吗?**

- * - 我知道,我知道,VB6,1998打电话,他们想要他们过时的专有bug生成器,等等。不是我的决定。但代码有效。一般

- ** - 在这里插入佛教笑话。


更新编辑:客户服务可能偶然发现了什么;它可能与数据库中的客户端配置设置有关。新的证据表明,对于该客户端或我的软件而言,错误配置的某些东西在响应特定配置时做了一些愚蠢的事情。而且问题可能比我们想象的更广泛,因为这个特殊功能并不像我想象的那么常用。

回应评论:

  • 调试器:理论上可行,但考虑到我们的设置,看起来很头疼。
  • 高冗长度记录,Java:这是个好主意,特别是考虑到问题可能比我原先认为的更广泛。是时候开始重新审视一些假设了。并可能吟唱他们。像小海豹一样。
  • 高冗长度记录,VB6:可能性;将需要卷入高级冗长的Java日志记录以捕获输出,因为我的VB6-fu非常弱,我不知道如何将文本输出到文件。但是,是的,知道脚本是否被调用将是有价值的。
  • 窗口事件查看器:不熟悉此工具。可能要改正。
  • 路径问题:感觉不太可能; Java代码构造了一个可执行文件的相对路径,它看起来不像是依赖于任何环境变量。

我感谢人们提供的建议;至少,你让我的大脑朝着充满希望的方向前进。


解决方案编辑:胜利者是......这不是一个错误,这是一个功能!一个功能可怕,可怕的错误。一个现在将被绝育的功能,以便不再打扰我们。

一批无效的假设使我无法更快地看到它,其中最重要的是“我不需要使用更多的调试语句来处理代码 - 已经在那里的语句告诉我所有我需要知道的!” DaDaDom,如果你想把你的评论变成一个答案,那么你就会有一个闪亮的标记。

感谢所有提出建议的人。现在,如果你能原谅我,我的办公桌会迟到了。

3 个答案:

答案 0 :(得分:1)

Hmmmm。我被告知从Java执行程序既简单又困难。简单的部分是启动它们。困难的部分是处理I / O流(参见my earlier question on using Runtime.exec())。也许VB程序在这些特定的机器上做了或期望奇怪的事情,Java代码没有正常工作。


编辑:我还找到了Jakarta Commons Exec的链接:

  

<强>原理

     

从Java执行外部进程是一个众所周知的问题领域。它依赖于平台,并且需要开发人员知道并测试特定于平台的行为,例如在Windows上使用cmd.exe或导致死锁的有限缓冲区大小。 JRE对此的支持非常有限,尽管新的Java SE 1.5 ProcessBuilder类更好。

     

可靠地执行外部进程还可能需要在执行命令之前或之后了解环境变量。在J2SE 1.1-1.4中,不支持此操作,因为不推荐使用用于检索环境变量的方法System.getenv()。

     

目前有几个不同的库为了自己的目的在Runtime.exec()周围实现了框架来处理上面列出的各种问题。拟议的项目应旨在协调和学习这些倡议,以创建和维护一个简单,可重复使用和经过良好测试的一揽子计划。由于一些问题较多的平台不易获得,我希望广泛的Apache社区可以提供很大的帮助。

答案 1 :(得分:1)

您是否考虑过经过身份验证的用户可能无权编辑工作站上的音量设置?如果以“管理员”身份运行,程序是否正确运行?

答案 2 :(得分:1)

这是一个答案: 您可以使用详细日志记录创建软件版本,还是可以调试代码?至少那时你可以判断它是在java还是VB部分。