NativeLongByReference在x64 OS上仅包含32位数字

问题描述 投票:0回答:1

我在参考typedef unsigned __int64 EntityNumber;输入参数的功能上遇到了阶段性问题。

库是x64,操作系统是Windows 10。

如果我通过NativeLongByReference,则输出缓冲区只有4个字节,因此如果我的数字超过32位,则该数字将被破坏。我用dump进行了检查,它确实包含一半的64位Long

如果我通过DoubleByReference,我可以使用doubleByReference.pointer.getLong(0)来获得我的多头头寸。

虽然这种黑客工具有效,但我想知道,如果两个操作系统都是64位,Long有什么问题?

long TRANS2QUIK_API __stdcall TRANS2QUIK_SEND_SYNC_TRANSACTION (LPSTR lpstTransactionString, long* pnReplyCode, PDWORD pdwTransId, EntityNumber* pnOrderNum, LPSTR lpstrResultMessage, DWORD dwResultMessageSize, long* pnExtendedErrorCode, LPSTR lpstErrorMessage, DWORD dwErrorMessageSize);

和JNA接口

    NativeLong TRANS2QUIK_SEND_SYNC_TRANSACTION(
            String lpstTransactionString,
            NativeLongByReference pnReplyCode,
            NativeLongByReference pdwTransId,
            DoubleByReference pdOrderNum, <- hack!
            byte[] lpstrResultMessage,
            int dwResultMessageSize,
            NativeLongByReference pnExtendedErrorCode,
            byte[] lpstrErrorMessage,
            int dwErrorMessageSize
    );

openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.4+11, mixed mode)
java jna
1个回答
0
投票

在Windows上,a long is a 32-bit integer,与操作系统的位数无关。

因此long将在Windows上指向32位NativeLong值,在Windows代码中不必使用。 long类型更适用于* nix操作系统。

[您可以在JNA源代码中看到它,其中NativeLong的大小在NativeLong中定义,其中Native.java源自LONG_SIZE类型的原生sizeof()函数,long

在Windows上确实改变大小的类型是a 32-bit integer类型。实际上,指向Pointer的指针在相应系统上是32/64位,而指向的值是32位。

© www.soinside.com 2019 - 2024. All rights reserved.