使用Java JNA捕获Win32事件

时间:2014-05-14 11:41:42

标签: java winapi jna

我正在解决这个问题:

在我的Java应用程序(安装在Windows操作系统机器上)中,我必须捕获由同一台机器上的另一个应用程序创建的Win32事件。这个应用程序是用C ++编写的,没有办法改变它。我有必须使用OpenEvent函数的信息。我开始如下所述: Calling OpenEvent fails through JNA

这是我的代码:

    public class WinEventListener {
    private Logger logger = LoggerFactory.getLogger(WinEventListener.class);

    static {
        Native.register("kernel32");
    }

    public static native HANDLE OpenEventW(int access, boolean inheritHandle, WString name);

    public static native int WaitForSingleObject(HANDLE hHandle, int dwMilliseconds);

    public static native boolean CloseHandle(HANDLE hObject);

    public static class HANDLE extends PointerType {

        public Object fromNative(Object nativeValue, FromNativeContext context) {
            Object o = super.fromNative(nativeValue, context);
            if (INVALID_HANDLE_VALUE.equals(o))
                return INVALID_HANDLE_VALUE;
            return o;
        }
    }

    static HANDLE INVALID_HANDLE_VALUE = new HANDLE() {

        {
            super.setPointer(Pointer.createConstant(-1));
        }

        public void setPointer(Pointer p) {
            throw new UnsupportedOperationException("Immutable reference");
        }
    };

    public void listen() throws Exception {
        HANDLE handle = null;
        do {
            //logger.debug("Wainting for handle");
            handle = OpenEventW(2, false, new WString("VLIT_SERVER_DATA"));
            logger.debug("Handle:" + handle.toString());
            Thread.sleep(1000);
        } while (handle == null);
        logger.debug("Handle obtained");

        while(true){
            int result = WaitForSingleObject(handle,Integer.MAX_VALUE);
            if(result == 0){
                logger.debug("Handle signalized");
                VLITProcceserThread thread = new VLITProcceserThread();
                thread.start();
                CloseHandle(handle);
            }
        }

    }


}

Basiclly我想在listen()方法等待HANDLE由其他程序创建,如果它被创建然后等待其信号状态,做一些动作并释放句柄。

BUt我没有成功。有人能指出我的正确方法吗?

Thans很多!

1 个答案:

答案 0 :(得分:0)

如果是失败的句柄打开,则很可能是特权问题。您的程序是作为服务运行的吗?我正在尝试做类似的事情,并且当我通过系统调用在作为服务运行的程序中调用它时,能够使该程序运行并正常工作。

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.PointerType;
import com.sun.jna.WString;
import com.sun.jna.FromNativeContext;

public class WinEventListener {
    static {
        Native.register("kernel32");
    }

public static native HANDLE OpenEventW(int access, boolean inheritHandle, WString name);

public static native int WaitForSingleObject(HANDLE hHandle, int dwMilliseconds);

public static native boolean CloseHandle(HANDLE hObject);

public static class HANDLE extends PointerType {

    public Object fromNative(Object nativeValue, FromNativeContext context) {
        Object o = super.fromNative(nativeValue, context);
        if (INVALID_HANDLE_VALUE.equals(o))
            return INVALID_HANDLE_VALUE;
        return o;
    }
}

static HANDLE INVALID_HANDLE_VALUE = new HANDLE() {

    {
        super.setPointer(Pointer.createConstant(-1));
    }

    public void setPointer(Pointer p) {
        throw new UnsupportedOperationException("Immutable reference");
    }
};

public void listen() {
    try {


        HANDLE handle = null;
        do {
            handle = OpenEventW(2031619, false, new WString("event_name"));
            if(handle == null) {
                System.out.print("Handle is null\n");
            }
            Thread.sleep(500);
        } while (handle == null);

        while(true){
            // 50 second timeout
            int result = WaitForSingleObject(handle, 50000);
            if(result == 0){
                System.out.print("Handle signaled\n");
            }
            else if (result == 258){
                System.out.print("Timed out\n");
            }
            else{
                System.out.print("Handle not signaled\n");
                System.out.print(result);
            }
            System.out.print(result);
            //System.out.print(handle);
            Thread.sleep(100);
        }
    }
    catch (Exception exc)
    {
        System.out.print(exc);
        //Thread.sleep(10000);

        //writer.writeln(exc);
    }

}

public static void main(String[] args) {
    WinEventListener listener = new WinEventListener();
    listener.listen();
}

}