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 ?
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é)
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
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 ?
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
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é)
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é)
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é)
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
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))
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
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
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
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