我在参考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)
在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位。