【问题标题】:Java DLL Function: Connecting to MicroFocus Rumba ehlapi32Java DLL 函数:连接到 MicroFocus Rumba ehlapi32
【发布时间】:2014-08-19 02:29:10
【问题描述】:

我有一个问题,几个月来我一直在努力解决。我正在尝试使用 Java 中的 ehlapi32.dll 库连接到 MicroFocus Rumba。 Java 的在线参考资料并不多。我尝试使用 JNA 加载它们,但我继续收到“1”状态,这意味着给定的过程不正确。我不确定这是否是正确声明函数或可能是过程的问题。我通过使用 windows cmd 'tasklist' 并找到我的 WDDspPag.bin PID 手动提供了 processID。

我写了很多 VB 程序,用下面的连接就好了:

Declare Function WD_ConnectPS Lib "Ehlapi32.DLL" (ByVal hInstance As Long, ByVal ShortName As String) As Integer
Declare Function WD_CopyPSToString Lib "Ehlapi32.DLL" (ByVal hInstance As Long, ByVal Position As Integer, ByVal Buffer As String, ByVal length As Integer) As Integer
Declare Function WD_CopyStringToPS Lib "Ehlapi32.DLL" (ByVal hInstance As Long, ByVal Position As Integer, ByVal Buffer As String, ByVal length As Integer) As Integer
Declare Function WD_SendKey Lib "Ehlapi32.DLL" (ByVal hInstance As Long, ByVal KeyData As String) As Integer
Declare Function WD_DisconnectPS Lib "Ehlapi32.DLL" (ByVal hInstance As Long) As Integer

我的问题可能是过程,在 VB 中我这样声明:

Declare Function GetCurrentProcessId Lib "kernel32" () As Long

所以我想知道我的流程是否被正确声明?如果我可以手动输入该过程以进行测试?我想我需要“找到” Rumba 进程,但下面的代码似乎给了我 JVM 正在使用的进程?

    import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.Platform;
    import com.sun.jna.platform.win32.Kernel32;


    public class RumbaConnect {


         public interface ehlapi32 extends Library {
             ehlapi32 ehlapi32 = (ehlapi32) Native.loadLibrary(
                    (Platform.isWindows() ? "ehlapi32" : "ehlapi32"), ehlapi32.class);
                public int WD_ConnectPS(long hInstance , String ShortName);
                public int WD_DisconnectPS(long hInstance);
            }
        public static final ehlapi32 ehlapi32 = (ehlapi32) Native.loadLibrary("ehlapi32", ehlapi32.class);   
        public static final Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);



         public static void main(String[] args) {
             int process = 0; 
             int status = 0; 

             process = kernel32.GetCurrentProcessId();
             status = ehlapi32.WD_ConnectPS(process, "a");
            // status = getProcAddress.WD_ConnectPS(5976, "A");
                System.out.println("Your Rumba Status: " + status);

         }
        /*  0  The function was successful  
            1  An incorrect PSID was specified  
            8  No prior call to Start Communication Notification (80) function was called for the PSID  
            9  A system error was encountered  
        */
    }

最后,预期的结果应该是“零”,正如 Java cmets 中所提供的。提前致谢。库加载正常,我通过 Eclipse -> Windows -> Pref -> Java -> Installed JREs -> Edit Default JRE -> 在 Eclipse 中设置路径并输入“-Djava.library.path=C:\Windows\System32; C:\Rumba\system" 所以我不认为加载库是一个问题。

编辑:

另外,上面的 VB 代码在 MSAccess 和 MS Excel 中使用,所以可能是默认加载了参考库,它只需简单地声明一个函数即可。具体如下:

Declare Function WD_ConnectPS Lib "Ehlapi32.DLL" (ByVal hInstance As Long, ByVal ShortName As String) As Integer

只有实例和 Rumba 窗口(在本例中为“A”)被传递,然后它返回一个状态“0”,这意味着它的活动和准备好,或者一些其他代码(参见代码 cmets)。

【问题讨论】:

  • 当然GetCurrentProcessId 给你的是你当前的进程id,而不是你可能感兴趣的其他进程的id(它怎么知道你想要哪个?)这段代码似乎是多余的: Platform.isWindows() ? "ehlapi32" : "ehlapi32"
  • 是的,我想那么多..这就是我手动输入 PID 的原因。稍后我可以弄清楚如何自动化,现在我专注于通过 Java “连接”到 Rumba。有什么建议吗?
  • 不,抱歉。您在 VB 中将什么值传递给 WD_ConnectPS?从GetCurrentProcessId那里返回的值呢?这似乎没有意义,但是...
  • 不,这就是 ehlapi32 库发挥作用的地方。您只需传递 processid + Rumba 字母(在本例中为“A”),如果 Rumba 窗口可用,它将输出“0”。否则,别的东西。我会将此添加到我的问题中以获取更多信息。

标签: java c# swing winapi kernel32


【解决方案1】:

我发现了问题所在。事实证明,hInstance 需要声明为“int”而不是“long”。在我继续使用代码之后,我终于能够从 Java 进行通信并发送一个字符串。代码如下,以防有人喜欢它作为示例。它是连接和发送字符串的实际工作代码。您可以使用以下代码轻松添加所有 EHLAPI 函数:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.platform.win32.Kernel32;


public class RumbaConnect {


     public interface ehlapi32 extends Library {
         ehlapi32 ehlapi32 = (ehlapi32) Native.loadLibrary(
                (Platform.isWindows() ? "ehlapi32" : "ehlapi32"), ehlapi32.class);
            public int WD_ConnectPS(int hInstance , String ShortName);
            public int WD_SendKey(int hInstance, String KeyData);
        }
    public static final ehlapi32 ehlapi32 = (ehlapi32) Native.loadLibrary("ehlapi32", ehlapi32.class);   
    public static final Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);



     public static void main(String[] args) {
         int process = 0; 
         int status = 0; 
         int intResult = 0; 

         process = kernel32.GetCurrentProcessId();
         status = ehlapi32.WD_ConnectPS(process, "A");
         intResult = ehlapi32.WD_SendKey(process, "MYNAME");
            System.out.println("Your Rumba Status: " + status);

     }
    /*  0  The function was successful  
        1  An incorrect PSID was specified  
        8  No prior call to Start Communication Notification (80) function was called for the PSID  
        9  A system error was encountered  
    */
}

【讨论】:

    【解决方案2】:

    使用 C# .NET 以 http://www.codeproject.com/Articles/9615/Using-EHLLAPI-in-C 为例,这会更容易完成。由于 C# 和 Java 非常相似,您可以看一下。此外,您还可以使用 Java .NET 库来帮助模拟 C# 程序。另一个但不是首选的选择是使用 vb 运行 shell 脚本来抓取,同时使用 Java 作为图形界面。如果数据大小合适并且可以从文本文件存储到矢量,这将很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多