Bonjour tout le monde
Je suis en train de travailler sur une interface qui fonctionne à base de DHTML (donc la classe CHtmlView) qui doit se refraichir (par JavaScript) quand arrivent des messages réseau. Sur de divers sites, j'ai trouvé des exemples mais à chaque fois le JavaScript est appelé quand l'utilisateur clique sur un boutton. Problème: l'appel via un autre thread ne marche pas! Je m'expliques:
J'ai généré un projet avec vue HTML en utilisant les options de Visual C++ 6 (projet MFC classique). Dedans, j'ai marqué toutes mes modifications avec le commentaire "JavaScript problem sample" et en effet ces derniers sont dans les fichiers JavaScriptView.h et JavaScriptView.cpp .
Dans JavaScriptView.h, je fais out simplement un override de la méthode OnDocumentComplete.
Dans JavaScriptView.cpp, j'ajoutes deux headers (atlbase.h and mshtml.h) ainsi que la fonction suivante:
1. // Added for the JavaScript problem sample
2. DWORD WINAPI CallJScriptLater( LPVOID lpParam )
3. {
4. CComQIPtr<IHTMLDocument2> pHtmlDoc( ((CJavaScriptView*) lpParam)->GetHtmlDocument() );
5.
6. CComPtr<IHTMLWindow2> pWnd;
7. pHtmlDoc->get_parentWindow( &pWnd );
8.
9. CComBSTR bstrMember(CString("alert('boo')"));
10.
11. // then simply execute it
12. CComBSTR vtlanguage(CString("javascript"));
13. VARIANT vresult;
14.
15. pWnd->execScript(bstrMember,vtlanguage,&vresult);
16.
17. return 0;
18. }
Et, la fonction qui va l'appeler quand c'est bon:
1. // Added for the JavaScript problem sample
2. void CJavaScriptView::OnDocumentComplete( LPCTSTR lpzsURL )
3. {
4. CHtmlView::OnDocumentComplete( lpzsURL );
5.
6. #if 1
7. CallJScriptLater( this );
8. #else
9. CreateThread( NULL, 0, CallJScriptLater, this, 0, NULL);
10. #endif
11.
12. }
Finalement, j'ai changé OnInitialUpdate pour qu'elle charge about:blank (la page la plus simple imaginable):
1. void CJavaScriptView::OnInitialUpdate()
2. {
3. CHtmlView::OnInitialUpdate();
4.
5. // Changed for the JavaScript problem sample
6. Navigate2(_T("about:blank"),NULL,NULL);
7. }
Donc, le programme::
- Une fois initialisé, charge la page about:blank
- Une fois le chargement complet, execute le JavaScript: alert('boo')
La JavaScript peut être appelé de deux manières:
- Directement (si OnDocumentComplete a la partie #if 1)
- Via un thread (si OnDocumentComplete a la partie #if 0)
PROBLEME: L'appel direct (JavaScript_directCall.exe) fonctionne alors que l'appel via thread (JavaScript_threadCall.exe) foire!
Si quelqu'un aurait une idée de solution merci de me le faire savoir, vous trouverez les sources sur
http://temp.alishomepage.com/.RMI/JavaScript.zip
Vous remerciant
S. Ali Tokmen
http://ali.tokmen.com