Problème de Message

poireau2001

Nouveau membre
Bonjour

J'ai un lecteur de carte. Il est fournit une dll avec. Lorsque l'on active cette dll, un Thread est crée. Il reçoit les interruptions du lecteur et les traduits pour l'application en message WM_USER+1.

Tout ceci est transparent pour l'utilisateur

De mon côté j'ai donc fait ceci pour récupérer le message WM_USER + 1 :

void __fastcall TForm1::recup_message(tagMSG &Msg, bool &Handled)
{
if (Msg.message == (WM_USER + 1))
{
;
Edit1->Text = "POLLING";
Handled=true;
}
}

Rien que pour tester...

Hors, lorsque je reçois le bon message, tous plante !!! Par contre si je change le message et je mets WM_PAINT, ça marche...

Est ce que quelqu'un peut m'éclairer svp ?
 

KangOl

Grand Maître
tu recois bien le message WM_USER+1 ??
il plante sur quel instruction ?
et c'est quoi ce pt-virgule juste apres le if ?
 

poireau2001

Nouveau membre
Oups pour le point virgule... Bah le truc c'est que je n'ai meme pas le temps de voir :

Mon lecteur est un lecteur de carte sans contacts. Il envoie une interruption au pc (qui transforme ça en message WM_USEr +1) dès qu'une carte est dans le champ du lecteur...

Dès que je mets la carte, ça plante...
Si j'enlève ce bout de code et que je mets la carte, ça ne plante plus...
 

damocles31

Habitué
Edit est déclaré comment ? c'est une variable globale ? un membre de la classe TForm1 ?
Serait-il initialisé correctement ? S'il vaut NULL, c'est normal que ça plante...
 

zeb

Modérateur
Depuis quand on affecte une chaine avec "=" ?
C'est du C/C++ :
Code:
Edit.SetWindowText ( "Apprendre le C/C++" );
 

zeb

Modérateur
Bah, ça compile, certes, mais ça plante : la preuve :
Hors, lorsque je reçois le bon message, tous plante !!!
Et puis par principe, il aurait été sympa de préciser que tu bosses sur C++ Builder.
Et avant de me demander d'essayer sur tel ou tel système, as-tu essayé un SetWindowText sur ton composant (dont tu ne dis toujouts rien, malgré la demande de Damocles) ?
 

poireau2001

Nouveau membre
MDR, mais nan, ce sont les messages Windows ! WM_USER ! WM_PAINT et compagnie... pas les messages que t'affiches !
 

zeb

Modérateur
J'ai bien compris. Pour t'en convaincre, laisse [CPP]message == (WM_USER + 1)[/CPP]
et retire la ligne [CPP]Edit1->Text = "POLLING";[/CPP].

Et hop, ça va fonctionner. Sinon, tu peux suivre les bons conseils de KangOl : le mode DEBUG, y'a pas mieux.
 

poireau2001

Nouveau membre
oui, enfin bon, quelqu'un a une idée pour recevoir les WM_USER+1 qu'un Thread lance a son appli, sans planter ! Svp...
(Fonction OnMessage de C++ Builder testé, et la boucle des messages aussi...Ca plante sans rentrer dedans, même :'( !!!

SVP :'(
 

poireau2001

Nouveau membre
[cpp]#include <Windows.h>

// Stdio est nécessaire pour sprintf()
#include <stdio.h>

#define WM_SI_CA_MARCHE_MIEUX_COMME_CA WM_USER+1

// Rien de spécial par ici (cf. projet02)
LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);


int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX principale;
principale.cbSize=sizeof(WNDCLASSEX);
principale.style=CS_HREDRAW|CS_VREDRAW;
principale.lpfnWndProc=MainProc;
principale.cbClsExtra=0;
principale.cbWndExtra=0;
principale.hInstance=hInstance;
principale.hIcon=LoadIcon(NULL,IDI_APPLICATION);
principale.hCursor=LoadCursor(NULL,IDC_ARROW);
principale.hbrBackground=reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
principale.lpszMenuName=NULL;
principale.lpszClassName="std";
principale.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&principale);

HWND hWnd;
USHORT *status = new USHORT;
hWnd=CreateWindowEx(
WS_EX_CLIENTEDGE,
"std",
"Notre fenêtre",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);

// On affiche pas la fenêtre
ShowWindow(hWnd,SW_HIDE);

/*TOUTES LES FONCTIONS COMMENCANT PAR "SH" SONT PROPRES A UNE DLL QUI CREE
LE THREAD AUTOMATIQUEMENT EN LUI PASSANT LE HANDLE DE LA FENETRE*/
//INTIALISATION DU THREAD
SH_Init_Library(1,hWnd);
SH_TAG_ScanOnOff(0x0001, status);
//LE THREAD EST A L'ETAT "SUSPEND"

//THREAD ACTIF A PARTIR D'ICI :
SH_Resume_Thread();

MSG msg;
while(GetMessage(&msg,NULL,0,0)==TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

LRESULT CALLBACK MainProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
{
// Quelques variables utiles
HDC hDC;
PAINTSTRUCT paintst;
POINT pt,pt1;
char buf[256];

switch (mes)
{
case WM_CREATE:
SetTimer(hWnd,NULL,2000,NULL);
return 0;
case WM_LBUTTONDOWN:
// Le bouron gauche est pressé
// On récupère la position écran
GetCursorPos(&pt);

// On la convertit en coordonnées dans la zone client
pt1=pt;
ScreenToClient(hWnd,&pt1);

sprintf(buf,"Clique gauche @ (%d ; %d) [SCR]\nClique gauche @ (%d ; %d) [WND]",pt.x,pt.y,pt1.x,pt1.y);

// On affiche une boite de dialogue prédéfinie
MessageBox(hWnd,buf,"Info",MB_OK);
return 0;
case WM_RBUTTONDOWN:
// Le bouron droit est pressé
// Même traitement
GetCursorPos(&pt);
pt1=pt;
ScreenToClient(hWnd,&pt1);
sprintf(buf,"Clique droit @ (%d ; %d) [SCR]\nClique droit @ (%d ; %d) [WND]",pt.x,pt.y,pt1.x,pt1.y);
MessageBox(hWnd,buf,"Info",MB_OK);
return 0;
case WM_CHAR:
// Une touche est pressée
sprintf(buf,"Caractère '%c' pressé!",(char)wParam); // On récupère le caractère ASCII correspondant
MessageBox(hWnd,buf,"Info",MB_OK);
return 0;
case WM_TIMER:
// Il est temps d'afficher la fenêtre
ShowWindow(hWnd,SW_SHOW);

// Pour ne pas réafficher la fenêtre toutes les 2s
KillTimer(hWnd,NULL);
return 0;
case WM_PAINT:
hDC=BeginPaint(hWnd,&paintst);
EndPaint(hWnd,&paintst);
return 0;
case WM_DESTROY:
// On ferme!
PostQuitMessage(0);
return 0;
case WM_SI_CA_MARCHE_MIEUX_COMME_CA:
//ON SUSPEND LE THREAD POUR EVITER DE RECEVOIR D'AUTRZ MESSAGES !
SH_Suspend_Thread();
sprintf(buf,"THREAD!",(char)wParam); // On récupère le caractère ASCII correspondant
MessageBox(hWnd,buf,"Info",MB_OK);
SH_Resume_Thread();
return 0;

default:
return DefWindowProc(hWnd, mes, wParam, lParam);
}
}[/cpp]
 

Harkonnen

Expert
[cpp]
case WM_USER + 1:
[...]
[/cpp]
mon dieu que c'est crade [:mlc]

tu peux pas faire un #define au debut de ton code ?
[cpp]
#define WM_MYMESSAGE WM_USER+1
[...]
case WM_MYMESSAGE:
[...]
[/cpp]
 

damocles31

Habitué
C'est où que ça plante exactement ? un petit coup de débuggueur devrait t'indiquer la ligne fautive.

dans le traitement de WM_SI_CA_MARCHE_MIEUX_COMME_CA, il manque un '%c' pour le caractère reçu
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 136
Messages
6 718 120
Membres
1 586 398
Dernier membre
mookie767
Partager cette page
Haut