OVH Cloud OVH Cloud

Voip et windowproc

5 réponses
Avatar
steganux
Bonjour

Je suis actuellement en train de d=E9velopper un softphone, pour cela
j'utilise une dll externe "iaxclient.dll"
dans cette dll se trouve une fonction nomm=E9e
iaxc_set_event_callpost( void *handle, int id)
que je suis cens=E9 appeler en lui passant comme param=E8tre une
windowproc (enfin le handle) qui va utiliser la variable id comme
parametre "Msg". Dans ma windowproc je doit verifier si "Msg"=3Did, si
oui alors c'est un message de ma librairie et il faut que je le traite.

J'ai ecrit ma windowproc comme ceci pour faire les premiers tests :

//d=E9claration globale fenetre Main
//----------------------------------------------
gnPrevproc est un entier
gnhMain est un entier =3D Handle()
CONSTANTE
resetat=3DWM_USER + 201
FIN

//Initialisation de Main
//----------------------------------------------
gnPrevproc=3DAppelDLL32("user32","SetWindowLongA",gnhMain,"GWL_WNDPROC",&Wn=
dProc)

//Fermeture de Main
//----------------------------------------------
SI gnPrevproc ALORS

gnPrevproc=3DAppelDLL32("user32","SetWindowLongA",gnhMain,"GWL_WNDPROC",gnP=
revproc)
gnPrevproc=3D0
FIN

//J'ai cr=E9e une fonction locale WndProc :
//----------------------------------------------
FONCTION WndProc(nhWnd est un entier,nMsg est un entier,nwParam est un
entier,nlParam est un entier)
nRet est un entier
SI nMsg=3DWM_COMMAND ALORS
Trace(nMsg)
FIN
SI gnPrevproc ALORS

nRet=3DAppelDLL32("user32","CallWindowProcA",gnPrevproc,nhWnd,nMsg,nwParam,=
nlParam)
FIN
RENVOYER(nRet)


//Voici l'appel de la fonction callpost de la dll iaxclient, cens=E9
appel=E9
WndProc :
//----------------------------------------------
resinit=3DAPI("iaxclient.dll","iaxc_set_event_callpost",&WndProc,resetat)
//ce code se trouve dans un bouton sur la fenetre Main que j'=E9x=E9cute
en
premier au lancement de l'application avant d'utiliser les fonctions
courantes de ma dll (appels entrants, sortants,...)


Malheureusement je crois que la fonction WndProc n'est jamais appel=E9
car le
trace ne s'affiche pas quand la fonction est normalement appel=E9e par
la dll, aurais-je fait une erreur quelque part ?

Merci


Fabien, Steganux

5 réponses

Avatar
Romain PETIT
steganux vient de nous annoncer :
Bonjour


Bonjour,

gnPrevproc=AppelDLL32("user32","SetWindowLongA",gnhMain,"GWL_WNDPROC",&WndProc)



sans aller plus loin : le 2nd paramètre ne doit pas être une chaine
mais un entier (une constante GWL_WNDPROC qui vaut -4.

Cf un exemple googlesque en VB..
http://www.geocities.com/SiliconValley/Lab/1632/atch12.html


A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
steganux
Effectivement, c'est une belle erreur, par contre ça ne solutionne pas
completement mon problème, en effet, ma windowproc ne fonctionne pas
quand il y a un changement d'état de ma dll mais plutot quand je clic
dans les differentes zones de saisie de ma fenetre.
Serait-ce un problème de handle faux passé en paramètres ou tout
autre chose peut etre ?

Merci de votre aide
Avatar
Romain PETIT
steganux a présenté l'énoncé suivant :
Effectivement, c'est une belle erreur, par contre ça ne solutionne pas
completement mon problème, en effet, ma windowproc ne fonctionne pas
quand il y a un changement d'état de ma dll mais plutot quand je clic
dans les differentes zones de saisie de ma fenetre.
Serait-ce un problème de handle faux passé en paramètres ou tout
autre chose peut etre ?



Probablement le type d'évenement.
Dans ton code, tu traces lors d'un WM_COMMAND uniquement.
Il s'agit probablement d'un autre évenement.
Pour le savoir, trace plutôt nMsg pour savoir de quel évenement il
s'agit...

A+

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
floman321
j'avais une procedure pour recuperer les messages system :

PAINTSTRUCT est une structure
hdc est un entier //Type C : HDC
fErase est un booléen //Type C : BOOL
rcPaint est un RECT //RECT est une autre structure
fRestore est un booléen //Type C : BOOL
fIncUpdate est un booléen //Type C : BOOL
rgbReserved est une chaîne fixe sur 32 //Type C : BYTE
FIN
MSG est une structure
nHwnd est un entier //Type C : HWND
Message est un entier sans signe //Type C : UINT
nWParam est un entier //Type C : WPARAM
nLParam est un entier //Type C : LPARAM
nTime est un entier //Type C : DWORD
pt est un entier //Type C : POINT
FIN
Ev_ est MSG
LpPaint est un PAINTSTRUCT

BOUCLE
get_messages_system()
Multitâche(-1)
END

PROCEDURE get_messages_system()

// recoi les messages et les mets dans une structure MSG
API("USER32","GetMessageA",&Ev_,Null,0,0)

// distribut les messages reçu
API("USER32","TranslateMessage",&Ev_)
API("USER32","DispatchMessageA",&Ev_)

//Selon l'action
SELON Ev_:Message

CAS WM_PAINT :
API("USER32","BeginPaint",Ev_:nHwnd,&LpPaint)
API("USER32","EndPaint",Ev_:nHwnd,&LpPaint)
RENVOYER 0

AUTRE CAS : RENVOYER ....
(API("USER32","DefWindowProcA",Ev_:nHwnd,Ev_:Message,Ev_:nWParam,Ev_:nLPara m))

FIN
Avatar
steganux
Bonjour,

Voila desormais comment j'appel ma fonction :
resinit=API("iaxclient.dll","iaxc_set_event_callpost",&WndProc,WM_IAX)

et voici ma nouvelle windowProc :
FONCTION WndProc(nhWnd est un entier,nMsg est un entier,nwParam est un
entier,nlParam est un entier)
nRet est un entier
SI nMsg=WM_IAX ALORS
//...... traitement à effectuer
FIN
SI gnPrevproc ALORS
nRet=AppelDLL32("user32","CallWindowProcA",gnPrevproc,nhWnd,nMsg,nwParam ,nlParam)
FIN
RENVOYER(nRet)

donc je compare désormais nMsg avec la constante WM_IAX, cette
constante est celle que j'ai passé en paramètre à la fonction
Iaxc_Set_Event_Callpost de la dll

Mon problème est que chaque fois que ma dll est censé réagir je n'ai
rien dans ma windowproc, nMsg n'est jamais égal à WM_IAX

Pourquoi ?

pour info WM_IAX=WM_USER+201

Merci

Fabient,Steganux