Bonjour à tous,
Après plusieurs jours de recherches et au final quelque chose que je ne comprend pas bien, je fais appel a vos connaissances.
Je développe actuellement un ActiveX pour WindowsMobile en C++.
L'idée étant de pouvoir activer/désactiver les éléments spécifiques du terminal, Lecteur code barres, leds, vibreurs et aussi effectuer d'autre taches plus inintéressante.
J'ai quasiment fait tout ce qui m’intéressait, mais maintenant, il me reste une chose sur laquelle je bloque.
Mon ActiveX possède des Événements que l'on peut binder pour récupérer certain état de son fonctionnement.
Par exemple, un événement est appelé lorsque l'application JS a demandé a l'activeX de prendre une photo et de l'envoyer sur un serveur Web.
Cet événement prend en paramètres un code retour qui indique comment s'est passé la prise de photo. A ce niveau pas de problème.
Par contre j'ai besoin d'avoir un Thread qui tourne afin de prendre en compte les lecture de code barres et de déclencher un événement lorsque la lecture s'est bien passé.
La fonction bindée dans javascript recevra une chaine de caractères avec ce qui a été lu par le lecteur.
Seulement voila, lorsque je teste l'envoie de l’événement a partir d'une méthode mise a disposition par l''activeX, pas de soucis, par contre lorsque mon Thread essais de déclencher l’événement, rien ne se passe.
Lorsque j'utilise Invoke_OnScanRead depuis CtrlEventScanning je n'ai aucun problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 // Methode de test pour lévénement de lecture de Code STDMETHODIMP Ccamera::CtrlEventScanning(void) { AfxMessageBox(_T("Avant OnScanRead()")); Invoke_OnScanRead(CString("TestLecture")); AfxMessageBox(_T("Après OnScanRead()")); return S_OK; } // Méthode qui doit declencher l'appel de lévénement bindé dans JS STDMETHODIMP Ccamera::Invoke_OnScanRead(CString Code) { AfxMessageBox(_T("Appel de l'invok")); AfxMessageBox(Code); TCHAR dataBuf[2048] = {0}; VARIANTARG Arg = {0}; Arg.vt = VT_BSTR; Arg.bstrVal = Code.AllocSysString(); DISPPARAMS DispParams = { &Arg, 0, 1, 0 }; VARIANT Var = { 0 }; return V_DISPATCH(&m_OnScanRead)->Invoke((DISPID) 0, IID_NULL, 0, DISPATCH_METHOD, &DispParams, &Var, NULL, NULL); }
Lorsque j'utilise Invoke_OnScanRead depuis mon Thread, la méthode est bien appelé, j'ai bien les deux MsgBox avec appel de l'invok
ainsi que la valeur passée en paramètres.... par contre l’événement JS n'est pas lancé. et pire si je retente un deuxième appel, IE plante complètement.
Si je comprend bien, cela viendrai du model de gestion des Thread Compartimenté....
Je suis bien entrain de suivre quelques pistes mais celles ci me paraissent bien sinueuses.
http://www.codeguru.com/cpp/com-tech...-Using-ATL.htm
http://msdn.microsoft.com/en-us/library/ms809971.aspx
http://support.microsoft.com/kb/157437/fr
Si à tout hasard l'un d'entre vous s'était déjà frotté à cette problématique en ayant trouvé une solution, c'est avec le plus grand
bonheur que je serai près a écouter les oreilles bien grandes ouvertes.
Je continue les investigations.
Merci d'avance
Partager