Java DLL函数:连接到MicroFocus Rumba ehlapi32

Java DLL函数:连接到MicroFocus Rumba ehlapi32,java,c#,swing,winapi,kernel32,Java,C#,Swing,Winapi,Kernel32,我有一个问题,几个月来我一直在努力解决。我正在尝试使用Java中的ehlapi32.dll库连接到MicroFocus伦巴。关于Java的在线参考文献并不多。我已经尝试使用JNA加载它们,但我仍然收到“1”状态,这意味着给定的进程不正确。我不确定这是否是正确声明函数的问题,或者可能是进程的问题。我已使用windows cmd“tasklist”并查找我的WDDspPag.bin PID手动提供了processID 我已经编写了许多VB程序,并与以下内容进行了良好的连接: Declare Func

我有一个问题,几个月来我一直在努力解决。我正在尝试使用Java中的ehlapi32.dll库连接到MicroFocus伦巴。关于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
所以我想知道我的进程是否正确声明?是否可以出于测试目的手动输入流程?我想我需要“找到”伦巴进程,但下面的代码似乎给出了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注释中所提供的那样,预期结果应该是“零”。提前谢谢。库加载很好,我通过Eclipse->Windows->Pref->Java->Installed JRE->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”,表示其处于活动状态且已准备就绪,或者返回一些其他代码(请参阅代码注释)

以C#.NET为例,这将更容易实现。因为C#和Java非常相似,你可以看看。此外,您还可以使用Java.NET库来帮助模拟C#程序。另外一个,但不是第一个选择是使用vb运行shell脚本来进行刮取,同时使用Java作为图形界面。如果数据大小合适,并且可以从文本文件存储到向量中,那么这将非常有效

我解决了这个问题。事实证明,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  
    */
}

当然,
GetCurrentProcessId
提供了您当前的进程id,而不是您可能感兴趣的其他进程的id(它如何知道您想要哪个进程?)此代码似乎是多余的:
Platform.isWindows()?“ehlapi32”:“ehlapi32”
是的,我想了很多。。这就是我手动输入PID的原因。我可以在以后弄清楚如何实现自动化,因为现在我专注于通过Java“连接”伦巴。有什么建议吗?没有,对不起。在VB中传递给
WD\u ConnectPS
的值是多少?从那里返回的值是什么?这似乎没有道理,但是……不,这就是ehlapi32库发挥作用的地方。您只需传递processid+伦巴字母(在本例中为“A”),如果伦巴窗口可用,它将输出一个“0”。否则,将输出其他内容。我会将此添加到我的问题中以获取更多信息。