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:
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) ;
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
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);
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.
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.