[WD12] Appel à l'aide aux spécialistes C++

Le
Eric Laurent
Bonjour,

J'ai un souci de portage d'application en C++ vers Windev.
Le problème se situe au passage d'une structure sur un appel à une
fonction.
Voici un extrait du code en C++ et la fonction NET_DVR_Login qui me
pose le problème:

#define SERIALNO_LEN 48

typedef struct {
BYTE sSerialNumber[SERIALNO_LEN];
BYTE byAlarmInPortNum;
BYTE byAlarmOutPortNum;
BYTE byDiskNum;
BYTE byDVRType;
BYTE byChanNum;
BYTE byStartChan;
}NET_DVR_DEVICEINFO, *LPNET_DVR_DEVICEINFO;

NET_DVR_API LONG __stdcall NET_DVR_Login(char *sDVRIP,WORD
wDVRPort,char *sUserName,char *sPassword,LPNET_DVR_DEVICEINFO
lpDeviceInfo);


NET_DVR_DEVICEINFO DeviceInfo;
lUserID = NET_DVR_Login(csServerIP,m_ServerPort,cUserName, cPassword,
&DeviceInfo);

Voici ce que j''ai fait en Windev:

NET_DVR_DEVICEINFO est une structure
sfSSerialNumber est une chaîne fixe sur 48
nByAlarmInPortNum est un entier sur 1
nByAlarmOutPortNum est un entier sur 1
nByDiskNum est un entier sur 1
nByDVRType est un entier sur 1
nByChanNum est un entier sur 1
nByStartChan est un entier sur 1
FIN

gstDeviceInfo est une NET_DVR_DEVICEINFO

gnUserId=AppelDLL32(gsNomDLL,
"NET_DVR_Login",gsAdrsIp,gnPort,gsUser,gsPassword,&gstDeviceInfo)
SI gnUserId<1 ALORS
Erreur("Erreur NET_DVR_Login"+gnUserId)
Ferme
FIN


Merci d'avance pour vos lumières.

Eric

--
Eric Laurent
nospam.laurent.systel@wanadoo.fr
(enlever nospam.)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Romain PETIT
Le #16723931
Eric Laurent vient de nous annoncer :
Bonjour,



Bonjour,

NET_DVR_DEVICEINFO est une structure
sfSSerialNumber est une chaîne fixe sur 48
Merci d'avance pour vos lumières.



Essaye en utilisant une chaine ASCIIZ sur 48 à la place de la chaine
fixe ?

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Eric Laurent
Le #16724091
Romain PETIT avait énoncé :

Essaye en utilisant une chaine ASCIIZ sur 48 à la place de la chaine fixe ?

A+


Merci, mais ce n'est pas mieux.

Eric

--
Eric Laurent

(enlever nospam.)
Romain PETIT
Le #16724081
Eric Laurent a écrit :
Romain PETIT avait énoncé :
Essaye en utilisant une chaine ASCIIZ sur 48 à la place de la chaine fixe ?


Merci, mais ce n'est pas mieux.



Un tableau fixe de 48 entiers sans signe sur un octet ?

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Eric Laurent
Le #16724241
Romain PETIT a formulé la demande :

Un tableau fixe de 48 entiers sans signe sur un octet ?



Non plus.
Le problème vient peut être de *LPNET_DVR_DEVICEINFO après la
déclaration de structure ?
Je ne connais pas cette déclaration, apparemment LP signifierait "Long
Pointer"

J'en appelle aux spécialistes.

Merci,

Eric

--
Eric Laurent

(enlever nospam.)
patrice
Le #16724641
dans l'ideal BYTE = entier sans signe sur 1
et BYTE [] = tableau de .. entier sans signe sur 1
attention aussi qu'il faut savoir si les structures sont packées sur 4
octets ou 1 octets
parce que si 4 octets, chaque champ doit commencé à une adresse d'entier sur
4

ce qui donnerait
tableau de 48 entier sans signe sur 1
entier sur 4
entier sur 4
...

"Eric Laurent" news:
Bonjour,

J'ai un souci de portage d'application en C++ vers Windev.
Le problème se situe au passage d'une structure sur un appel à une
fonction.
Voici un extrait du code en C++ et la fonction NET_DVR_Login qui me
pose le problème:

#define SERIALNO_LEN 48

typedef struct {
BYTE sSerialNumber[SERIALNO_LEN];
BYTE byAlarmInPortNum;
BYTE byAlarmOutPortNum;
BYTE byDiskNum;
BYTE byDVRType;
BYTE byChanNum;
BYTE byStartChan;
}NET_DVR_DEVICEINFO, *LPNET_DVR_DEVICEINFO;

NET_DVR_API LONG __stdcall NET_DVR_Login(char *sDVRIP,WORD
wDVRPort,char *sUserName,char *sPassword,LPNET_DVR_DEVICEINFO
lpDeviceInfo);


NET_DVR_DEVICEINFO DeviceInfo;
lUserID = NET_DVR_Login(csServerIP,m_ServerPort,cUserName, cPassword,
&DeviceInfo);

Voici ce que j''ai fait en Windev:

NET_DVR_DEVICEINFO est une structure
sfSSerialNumber est une chaîne fixe sur 48
nByAlarmInPortNum est un entier sur 1
nByAlarmOutPortNum est un entier sur 1
nByDiskNum est un entier sur 1
nByDVRType est un entier sur 1
nByChanNum est un entier sur 1
nByStartChan est un entier sur 1
FIN

gstDeviceInfo est une NET_DVR_DEVICEINFO

gnUserId=AppelDLL32(gsNomDLL,
"NET_DVR_Login",gsAdrsIp,gnPort,gsUser,gsPassword,&gstDeviceInfo)
SI gnUserId<1 ALORS
Erreur("Erreur NET_DVR_Login"+gnUserId)
Ferme
FIN


Merci d'avance pour vos lumières.

Eric

--
Eric Laurent

(enlever nospam.)




Romain PETIT
Le #16724761
Eric Laurent a exprimé avec précision :
Romain PETIT a formulé la demande :

Un tableau fixe de 48 entiers sans signe sur un octet ?



Non plus.
Le problème vient peut être de *LPNET_DVR_DEVICEINFO après la déclaration de
structure ?
Je ne connais pas cette déclaration, apparemment LP signifierait "Long
Pointer"



Oui, mais c'est Ok puisque tu passes par adresse (&).
Tu es certain que c'est la structure qui pose problème ?
Quelle est l'erreur générée ?

Quel sont les types des autres arguments, gnPort notamment ?

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Eric Laurent
Le #16725341
Le 05/09/2008, Romain PETIT a supposé :
Oui, mais c'est Ok puisque tu passes par adresse (&).
Tu es certain que c'est la structure qui pose problème ?
Quelle est l'erreur générée ?

Quel sont les types des autres arguments, gnPort notamment ?

A+


En fait, le résultat de la DLL retourné est 0 alors qu'il devrait être
supérieur à 0.
Les autres arguments sonts OK car si je les modifie, je récupère un
évènement d'erreur sur une autre fonction Callback que je n'ai pas
décrite ici.
C'est donc pourquoi je pense que le problème vient de la structure ou
de son appel.

Eric.

--
Eric Laurent

(enlever nospam.)
Eric Laurent
Le #16725331
patrice a utilisé son clavier pour écrire :
dans l'ideal BYTE = entier sans signe sur 1
et BYTE [] = tableau de .. entier sans signe sur 1
attention aussi qu'il faut savoir si les structures sont packées sur 4
octets ou 1 octets



Comment sait-on si les structures sont packées sur 4 octets ?

Eric.

--
Eric Laurent

(enlever nospam.)
Romain PETIT
Le #16725661
Eric Laurent a exposé le 05/09/2008 :

En fait, le résultat de la DLL retourné est 0 alors qu'il devrait être
supérieur à 0.



Oui, mais s'il n'y a pas de plantage, ta sutructure est à priori OK
(sinon il y a de fortes chances d'avoir des violations de mémoire)

Les autres arguments sonts OK car si je les modifie, je récupère un évènement
d'erreur sur une autre fonction Callback que je n'ai pas décrite ici.
C'est donc pourquoi je pense que le problème vient de la structure ou de son
appel.



gnPort est bien sur 2 octets ?
(WORD = Entier sur 2 octets)

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Eric Laurent
Le #16727321
Merci à tous piur votre aide, le problème est résolu comme ceci.

NET_DVR_DEVICEINFO est une structure
szSSerialNumber est une chaîne fixe sur 48
nByAlarmInPortNum est un entier sans signe sur 1
nByAlarmOutPortNum est un entier sans signe sur 1
nByDiskNum est un entier sans signe sur 1
nByDVRType est un entier sans signe sur 1
nByChanNum est un entier sans signe sur 1
nByStartChan est un entier sans signe sur 1
FIN

gstDeviceInfo est une NET_DVR_DEVICEINFO

gnUserId=AppelDLL32(gsNomDLL,
"NET_DVR_Login",gsAdrsIp,gnPort,gsUser,gsPassword,&gstDeviceInfo)


Eric.

--
Eric Laurent

(enlever nospam.)
Publicité
Poster une réponse
Anonyme