Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

10 réponses
Avatar
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.)

10 réponses

Avatar
Romain PETIT
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é)
Avatar
Eric Laurent
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.)
Avatar
Romain PETIT
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é)
Avatar
Eric Laurent
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.)
Avatar
patrice
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" a écrit dans le message de
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.)




Avatar
Romain PETIT
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é)
Avatar
Eric Laurent
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.)
Avatar
Eric Laurent
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.)
Avatar
Romain PETIT
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é)
Avatar
Eric Laurent
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.)