代码之家  ›  专栏  ›  技术社区  ›  BlairHippo

在Java程序中调用外部可执行文件的困惑失败

  •  3
  • BlairHippo  · 技术社区  · 16 年前

    好吧,我碰到了一个只会把我的车弄糊涂的虫子。我想知道我可以调查什么,因为现在我什么都没有。就像这样:

    我有一个独立的Java应用程序,偶尔需要在它运行的计算机(WiXP机器)的体积中旋转该行。它通过调用一对可以获取和设置各种组件卷的外部可执行文件(用vb6*编写)来实现这一点。(它们可以处理线路输入、麦克风、波形、CD和主音量控制。)

    现场有几百台设备,运行在我公司提供和控制的硬件(戴尔机器)上。至少有几十个客户机正在使用这个特性,而且它工作得很好——除了一个实例。

    对于这台制造麻烦的机器来说,它根本不起作用。当应用程序运行时,我会观察音量滑块,当音量应该下降时,它们会保持不动。当我检查应用程序的日志文件时,它不会出错, 似乎正在执行删除卷的代码。当我从命令行运行可执行文件时,它们工作得很好。

    我不能保证这台机器和所有正常运转的机器100%相同,但我们已经买了一段时间相同的戴尔系列产品;至少,它非常非常相似。

    所以,把我的困惑变成一个项目清单:

    • 如果我在Java代码中做了一些愚蠢的事情(也就是说,不清除我的StdOut/StdRr缓冲区),为什么它只是这个机器上的一个问题?
    • 如果vb6可执行文件中有损坏的地方,为什么它们在其他每台机器上都工作 在这台机器上的命令行?
    • 如果这台机器上有某种硬件异常,什么异常会导致音量控制可执行文件失败 只有 当从Java应用程序调用时?

    我很困惑。我不喜欢困惑。有人对我的启蒙有什么建议吗?**

    -*--我知道,我知道,vb6,1998打电话给他们,他们想要他们过时的专有bug生成器回来,等等,这不是我的决定。但是代码是有效的。通常情况下。

    -在这里插入佛教笑话。


    更新编辑: 客户服务可能遇到了一些问题;这可能与数据库中的客户机配置设置有关。新的证据表明,要么是某个客户机配置错误,要么是我的软件在响应特定配置时做了一些愚蠢的事情。这个问题可能比我们想象的要普遍,因为这个特殊的特征并不像我想象的那样普遍。

    回复意见:

    • 调试器:理论上是可能的,但考虑到我们的设置,这看起来是一个巨大的难题。
    • 高维日志记录,Java:好主意,这个问题比我原先认为的更广泛。是时候重新审视一些假设了。也可能是打他们。就像小海豹。
    • 高冗长日志记录,VB6:一种可能性;将需要滚入高冗长的Java日志记录以捕获输出,因为我的VB6 FU是如此可怜无力,我不知道如何将文本输出到文件。但是,是的,知道剧本是否会被调用是很有价值的。
    • 窗口事件查看器:不熟悉此工具。可能必须纠正这一点。
    • 路径问题:不太可能;Java代码构造了一个可执行文件的相对路径,它看起来不依赖于任何环境变量。

    我感谢人们提供的建议;至少,你让我的大脑朝着有希望的方向移动。


    解决方案编辑: 获胜者是…这不是一个bug,这是一个特性!一个功能出现了可怕的错误。一个功能,现在将被中性化,以停止困扰我们。

    一批无效的假设使我无法更快地看到它,尤其是“我不需要在代码中使用更多的调试语句——已经存在的语句告诉了我所有我需要知道的东西!”Dadadom,如果你想把你的评论变成一个答案,它有一个闪亮的对勾。

    感谢大家的配合。现在,如果你能原谅我的话,我和我的办公桌开会迟到了。

    3 回复  |  直到 16 年前
        1
  •  1
  •   Dominik Sandjaja    16 年前

    下面是一个答案: 你能创建一个有详细日志记录的软件版本吗,或者你能调试代码吗?至少你可以判断它是在Java还是VB部分。

        2
  •  1
  •   Community Mohan Dere    9 年前

    嗯,嗯。有人告诉我,从Java执行程序既简单又困难。最简单的部分就是启动它们。最困难的部分是处理I/O流(请参见 my earlier question on using Runtime.exec() )也许VB程序正在或期待某些Java代码不能正常工作的特定机器上奇怪的事情。


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

    理论基础

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

    可靠地执行外部过程还需要在执行命令之前或之后了解环境变量。在J2SE1.1-1.4中,不支持这种方法,因为用于检索环境变量的方法system.getenv()已被弃用。

    目前有几个不同的库,出于各自的目的,已经围绕runtime.exec()实现了框架,以处理上面概述的各种问题。建议的项目应该着眼于协调和学习这些主动性,以创建和维护一个简单、可重用和经过良好测试的包。由于一些问题更大的平台不容易获得,我希望广大的Apache社区能够提供很大的帮助。

        3
  •  1
  •   Scruffers    16 年前

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