繁体   English   中英

Intptr,Intptr.Zero和ref int in Java等效项:

[英]Intptr, Intptr.Zero and ref int in java equivalent :

我在读取通过USB连接的扫描仪时遇到问题。 方法(LSConnect)的返回值始终与“找不到设备”相同。 通过阅读.NET中的示例,我发现他们使用了其他参数,如IntPtr,IntPtr.Zero,ref Int ...,我必须在Java中使用JNA来读取本机代码。

因此,这是C#中的LSApi.dll文档示例:

[DllImport(@"lsapi.dll")]
 internal extern static int LSConnect(int hWnd, int hInst, short Peripheral,ref short hConnect); internal extern static int LSDocHandle (short hConnect, int hWnd, short Stamp, short Validate, short CodeLine,byte Side,short ScanMode,short Feeder,short Sorter, short WaitTimeout,short Beep,ref int NrDoc,short Reserved1,int Reserved2); 

但是当我看到他们以前在.NET上所做的事情时:1 /声明:

        public static extern int LSConnect(IntPtr hwnd, IntPtr HInst, int Peripheral, ref int hConnect);

        public static extern int LSDocHandle(int hConnect,
                            IntPtr hWnd,
                            int Stamp,
                            int Validate,
                            int CodeLine,
                            char Side,
                            int ScanMode,
                            int Feeder,
                            int Sorter,
                            int WaitTimeout,
                            int Beep,
                            ref uint NrDoc,
                            int Reserved1,
                            int Reserved2);

2 /主要总是在.Net中:

 int b = -2;
        uint c = 0;
        IntPtr frontimg = IntPtr.Zero;
        IntPtr backimg = IntPtr.Zero;
        IntPtr R1 = IntPtr.Zero;
        IntPtr R2 = IntPtr.Zero;
        LsApi.LSConnect(IntPtr.Zero, IntPtr.Zero, 502, ref b);
        LsApi.LSDocHandle(b, IntPtr.Zero, LsApi.NO_STAMP, LsApi.NO_PRINT_VALIDATE, (int)LsApi.Codeline.NO_READ_CODELINE, (char)LsApi.Side.SIDE_FRONT_IMAGE, (int)LsApi.ScanMode.SCAN_MODE_COLOR_100, LsApi.AUTO_FEED, (int)LsApi.Sorter.SORTER_BAY1, LsApi.WAIT_NO, (int)LsApi.Beep.NO_BEEP, ref c, 0, 0).ToString();
        LsApi.LSReadImage(b, IntPtr.Zero, LsApi.CLEAR_ALL_BLACK, (char)LsApi.Side.SIDE_FRONT_IMAGE, 0, 0, ref frontimg, ref backimg, ref R1, ref R2);
        LsApi.LSDisconnect(b, IntPtr.Zero);

我用Doc Example中提到的方式在JAVA中声明了我的Method,它在C#中,但是我认为正确的方法是遵循.Net Example

这是我的JAVA代码:

public int LSConnect(int hWnd, int hInst, short i, ShortByReference hConnect);

public int LSDisconnect(short hConnect, IntByReference hWnd);

public int LSDocHandle(short hConnect, int hWnd, short Stamp,
        short Validate, short CodeLine, byte Side, short ScanMode,
        short Feeder, short Sorter, short WaitTimeout, short Beep,
        IntByReference NrDoc, short Reserved1, int Reserved2);

和主要阶层:

public class ConnectExample {

public static void main(String[] args) {
    String libName = "lsApi";
    JNAUser32 jnaUser32 = (JNAUser32) Native.loadLibrary(libName,
            JNAUser32.class);
    ShortByReference hConnect = new ShortByReference();
    hConnect.setValue((short) 55);

    int state = jnaUser32.LSConnect(0, 0, (short) 502, hConnect);
    System.out.println(state);
}

}

我只使用了LSConnect示例,因为:1-我必须将返回值表示为“ -1”,这表示连接正常2-我不知道等效于IntPtr,IntPtr.Zero和ref int的其他参数的等效项? 我对IntPtr和ref int都使用了intByReference。

IntPtr.Zero等于null IntPtr是一个足够容纳指针的整数类型。 避免使用它,而仅使用PointerPointerType

在这种情况下,如果要传递HANDLE则可以安全地使用HANDLE如果函数要为您填充一个值,则可以安全地使用HANDLEByReference

Medinoc所示ref intIntByReference相同。

如果您可以找到要调用的API 的直接C示例 ,则不必进行必需类型的转换。 通常,如果C#引用DLL,则您应该能够找到API的原始C声明。

显然, com.sun.jna.Pointer类与IntPtr等效。

对于ref intIntByReference应该很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM