Bonjour,
J'utilise actuellement un API (WvAPI.dll) natif (écrit en Ansi C) dans un développement dotNet frmaework 3.5.
J'ai déjà construit une partie du marshalling.
Cela semble bien fonctionner pour des structures simples mais j'ai quelques soucis pour cette structure:
Que j'ai mappé par l’intermédiaire du marshalling de la façon suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 typedef enum WV_OPERATING_MODE { WV_OPERATING_MODE_INVALID = 0, WV_OPERATING_MODE_MONITORING, WV_OPERATING_MODE_STANDBY, WV_OPERATING_MODE_READY, WV_OPERATING_MODE_BUSY, WV_OPERATING_MODE_PAPEROUT, WV_OPERATING_MODE_DOOR_OPEN, WV_OPERATING_MODE_COMM_FAILURE, WV_OPERATING_MODE_DEVICE_FAILURE, WV_OPERATING_MODE_NA, WV_OPERATING_MODE_DISCHARGE = WV_OPERATING_MODE_NA, WV_OPERATING_MODE_LAST = WV_OPERATING_MODE_NA } WV_OPERATING_MODE ; typedef int WV_CONNECT_ID ; typedef struct { TCHAR PatientName [WV_PATIENT_NAME_SIZE] ; TCHAR PatientID [WV_PATIENT_ID_SIZE] ; TCHAR BedLabel [WV_BED_LABEL_SIZE]; TCHAR CareUnit [WV_CARE_UNIT_SIZE]; TCHAR FileName [WV_FILE_NAME_SIZE]; TCHAR IPAddress [WV_IP_ADDRESS_SIZE]; TCHAR MulticastIP [WV_MULTICAST_IP_SIZE]; TCHAR DeviceType [WV_DEVICE_TYPE_SIZE]; WV_OPERATING_MODE DeviceStatus ; WV_CONNECT_ID ConnectID ; // 0 if not connected BOOL Wireless; TCHAR HostName [WV_HOSTNAME_SIZE] ; } WV_BED_DESCRIPTION ; typedef struct { WV_BED_DESCRIPTION WvBeds[WV_MAX_BEDS_PER_SERVER] ; } WV_BED_LIST ; IMPORT_FUNCTION int WINAPI WvListBeds(const TCHAR *pServerName, const TCHAR *pUserName, const TCHAR *pPassword, WV_BED_LIST *pBedList, int *pNumberOfBeds) ;
Ce que je constate c'est qu'à partir du champ DeviceStatus (qui est une énumération) la valeur retournée ne correspond pas à celle de l'application d'exemple fournie avec l'API. Tous les champs suivant sont affectés par cette erreur et on observe un décalage de 2 bytes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 public enum WV_OPERATING_MODE { WV_OPERATING_MODE_INVALID = 0, WV_OPERATING_MODE_MONITORING, WV_OPERATING_MODE_STANDBY, WV_OPERATING_MODE_READY, WV_OPERATING_MODE_BUSY, WV_OPERATING_MODE_PAPEROUT, WV_OPERATING_MODE_DOOR_OPEN, WV_OPERATING_MODE_COMM_FAILURE, WV_OPERATING_MODE_DEVICE_FAILURE, WV_OPERATING_MODE_NA, WV_OPERATING_MODE_DISCHARGE = WV_OPERATING_MODE_NA, WV_OPERATING_MODE_LAST = WV_OPERATING_MODE_NA }; [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct WV_BED_DESCRIPTION { [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = WV_PATIENT_NAME_SIZE)] public string PatientName; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = WV_PATIENT_ID_SIZE)] public string PatientID; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = WV_BED_LABEL_SIZE)] public string BedLabel; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = WV_CARE_UNIT_SIZE)] public string CareUnit; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = WV_FILE_NAME_SIZE)] public string FileName; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = WV_IP_ADDRESS_SIZE)] public string IPAddress; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = WV_MULTICAST_IP_SIZE)] public string MulticastIP; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = WV_DEVICE_TYPE_SIZE)] public string DeviceType; public WV_OPERATING_MODE DeviceStatus; public int ConnectID; // 0 if not connected public int Wireless; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = WV_HOSTNAME_SIZE)] public string HostName; }; [StructLayoutAttribute(LayoutKind.Sequential)] public struct WV_BED_LIST { [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = WV_MAX_BEDS_PER_SERVER, ArraySubType = UnmanagedType.Struct)] public WV_BED_DESCRIPTION[] WvBeds; }; [DllImportAttribute(Constants.NATIVE_DLL, EntryPoint = "WvListBeds", CharSet = CharSet.Ansi)] public static extern int WvListBeds( [MarshalAsAttribute(UnmanagedType.LPStr)] string pServerName, [MarshalAsAttribute(UnmanagedType.LPStr)] string pUserName, [MarshalAsAttribute(UnmanagedType.LPStr)] string pPassword, ref WV_BED_LIST pBedList, ref int pNumberOfBeds);
En effet, le champ Wireless vaut 0x50430000 or il doit être à 0x00000000.
le valeurs 0x50 et 0x43 correspondent à de l'ASCII du string suivant HostName.
Ainsi le HostName vaut "S207" alors qu'il doit valoir "CPS207".
Les caractères C et P correspondent respectivement à 0x43 et 0x50 en ASCII.
Pourriez-vous m'éclairer dans ce problème?
Est-ce au niveau de l'énumération?
Un tout grand merci pour la grande richesse de votre site web.
KINDT Raphaël.
Partager