我正在开发一个使用ffi
与已编译的C库进行交互的项目。我试图让一些复杂的数据结构起作用,并且在找出在这些数据结构中获取值的正确方法时遇到了问题。我有两个实例我想弄清楚。我不是一个C家伙,所以我就是为了这个目标。
有一个C struct
包含属性,它们看起来像指向字符数组的指针。这是定义struct
:
#define RPC_STRING_LENGTH 32
#define RPC_STRING_LENGTH_CALLID 128
typedef struct {
E_CALL_STATE eCallState;
BOOL bInboundCall;
BOOL bVideoCall;
BOOL bRecording;
BOOL bEncrypted;
BOOL bHDAudio;
BOOL bVirtualMeetingCall;
E_PROTOCOL_CODEC eCurrentCodec;
E_PROTOCOL_ALERT_INFO_CALL_TYPE eAlertInfoType;
double dAccumulatedMOSLQ;
int nVideoState;
int nErrorCode;
unsigned int nCallStartTime;
char cPhoneNumber[RPC_STRING_LENGTH];
char cName[RPC_STRING_LENGTH];
char cCallId[RPC_STRING_LENGTH_CALLID];
char cPreviousCallId[RPC_STRING_LENGTH_CALLID];
} RPC_CALL_STATE;
现在,我已经能够成功提取E_CALL_STATE
值和 BOOL
属性,但我很难在{{1}中获取字符串存储},cPhoneNumber
,cName
和cCallId
。以下是我使用cPreviousCallId
进行设置的方法:
ref-struct
以下是解释此import ref from 'ref';
import StructType from 'ref-struct';
const RPC_CALL_STATE = StructType({
eCallState: ref.types.int,
bInboundCall: ref.types.bool,
bVideoCall: ref.types.bool,
bRecording: ref.types.bool,
bEncrypted: ref.types.bool,
bHDAudio: ref.types.bool,
bVirtualMeetingCall: ref.types.bool,
dAccumulatedMOSLQ: ref.types.double,
nVideoState: ref.types.int,
nErrorCode: ref.types.int,
nCallStartTime: ref.types.uint,
cPhoneNumber: ref.types.char,
cName: ref.types.char,
cCallId: ref.types.char,
cPreviousCallId: ref.types.char,
});
的Javascript(供参考,struct
是外部定义的RPC_CALL_STATE
):
enum
如果我查看pDataRef = ref.reinterpret(pData, RPC_CALL_STATE.size);
pDataRef.type = RPC_CALL_STATE;
const callProgressStruct = ref.get(pDataRef);
上存储的值,我会得到callProgressStruct.cPhoneNumber
。所以,有几个问题:
0
是什么?
ref.types
是否正确?char
?cPhoneNumber
?我有一个C ref-array
定义如下:
struct
在此代码中,typedef struct AUDIO_OS_DEVICES {
int nNumberDevices;
AUDIO_OS_DEVICE *pDevices;
} AUDIO_OS_DEVICES;
最终成为*pDevices
结构的数组。这些结构在C中定义为:
AUDIO_OS_DEVICE
在Javascript中,我使用typedef struct AUDIO_OS_DEVICE {
int deviceId;
int deviceFlags;
char deviceName[AUDIO_OS_DEVICE_NAME_MAX_LEN];
char deviceUID[AUDIO_OS_DEVICE_UID_MAX_LEN];
char manufacturerName[AUDIO_OS_DEVICE_MANUFACTURER_MAX_LEN];
} AUDIO_OS_DEVICE;
进行了此设置:
ref-struct
我不知道将const AUDIO_OS_DEVICE = StructType({
deviceId: ref.types.int,
deviceFlags: ref.types.int,
deviceName: ref.types.char,
deviceUID: ref.types.char,
manufacturerName: ref.types.char,
});
const AUDIO_OS_DEVICES = StructType({
nNumberDevices: ref.types.int,
pDevices: [???],
});
转换为的类型,我是否知道如何提取pDevices
结构数组。我也遇到了已经用字符数组描述过的问题。
任何帮助将不胜感激。我已经走到了尽头,直到我能解决这个问题。