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 
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
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 
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
57public 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.

 

 
		
		 
        

 
			
			


 
   


 Marshalling struct décallage 2 bytes.
 Marshalling struct décallage 2 bytes.
				 Répondre avec citation
  Répondre avec citation
Partager