首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java函数:连接到MicroFocus Rumba ehlapi32

Java函数:连接到MicroFocus Rumba ehlapi32
EN

Stack Overflow用户
提问于 2014-06-27 21:24:32
回答 2查看 1.6K关注 0票数 1

我有一个问题,我已经尝试解决了几个月了。我试图使用MicroFocus中的ehlapi32.dll库连接到Java。对于Java来说,在线引用并不多。我尝试使用JNA加载它们,但是我继续接收'1‘状态,这意味着给定的进程是不正确的。我不确定这是一个正确声明函数的问题,或者可能是一个过程。通过使用windows 'tasklist‘并找到我的processID PID,我手动提供了WDDspPag.bin。

我编写了许多VB程序,并与以下内容连接得很好:

代码语言:javascript
复制
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中我声明如下:

代码语言:javascript
复制
Declare Function GetCurrentProcessId Lib "kernel32" () As Long

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

代码语言:javascript
复制
    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 ->在Eclipse中设置路径,安装了->编辑默认JRE ->并输入了JRE,所以我不认为加载库是一个问题。

编辑:

另外,上面的VB代码是在MSAccess和MSAccess中使用的,所以它可能是默认加载的引用库,它只是简单地处理一个函数的声明。具体而言:

代码语言:javascript
复制
Declare Function WD_ConnectPS Lib "Ehlapi32.DLL" (ByVal hInstance As Long, ByVal ShortName As String) As Integer

只传递实例和Rumba窗口(在本例中为"A"),然后返回'0‘的状态,这意味着它处于活动状态和就绪状态,或者返回其他代码(参见代码注释)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-30 22:22:52

我解决了问题。事实证明,hInstance需要声明为'int‘而不是'long.’‘。在继续使用代码之后,我终于能够通过Java进行通信并发送一个字符串。代码在下面,以防有人想要它作为一个例子。连接和发送字符串的是实际工作代码。下面的代码可以轻松地添加所有EHLAPI函数:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-06-30 20:53:27

以C# .NET为例,使用http://www.codeproject.com/Articles/9615/Using-EHLLAPI-in-C可以更容易地做到这一点。因为C#和Java非常相似,所以您可能会看到这一点。此外,您还可以使用Java .NET库来帮助模拟C#程序。另一种但不是首选的方法是使用vb运行shell脚本,同时使用Java作为图形界面。如果数据大小合理,并且可以从文本文件存储到向量,这将很好地工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24460969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档