Hello,
J'ai développé un gadget vista dont l'ossature est un .swf créé avec FLEX. Le but est de lire des musiques. Tout fonctionne tres bien mais j'ai récemment incorporé une méthode pour ecrire "ce que j'ecoute" sur MSN. Pour cela, j'ai du créer une DLL activex avec C++ (projet ATL sous visual c++ 2005), DLL appelée via un javascript via FLEX. Des que j'utilise la fonction de la DLL MSN via le javascript au bout d'une 10ene d'appels, j'ai un message d'erreur de windows m'indiquant que le volet windows doit fermer. Après avoir cliqué sur l'option "debogage" visual studio m'a emmené a une fonction m'indiquant un leak sur la mémoire....
Bref, le code de la fonction DLL qui envoie l'info de "ce que j'écoute" à MSN est le suivant : je suis sur a 100% qu'il n'y a pas de leak ici..
Par contre, la fonction javascript appellée depuis FLEX est la suivante :
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
26
27
28
29
30
31
32
33
34
35
36
37
38 STDMETHODIMP CclsDLLMSN::SendMessageMSN(BSTR m_strMessage, SHORT show) { HWND msnui = NULL; COPYDATASTRUCT msndata; // ASCII char Title[256]; memset(Title,'\0',sizeof(Title)); unsigned long length = WideCharToMultiByte (CP_ACP,0, m_strMessage,SysStringLen(m_strMessage), NULL, 0,NULL, NULL); char* strRet = new char[length]; length = WideCharToMultiByte (CP_ACP,0, m_strMessage,SysStringLen(m_strMessage), reinterpret_cast <char *>(strRet), length,NULL, NULL); strRet[length] = '\0'; sprintf(Title,"\\0Music\\0%i\\0{0}\\0%s\\0\\0\\0\\0\0",show,strRet); // UTF16 WCHAR wstrTitle[256]; memset(wstrTitle, 0, sizeof(CHAR)*256); // Conversion ASCII vers UTF16 int nLen = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)Title, -1, NULL, NULL); MultiByteToWideChar(CP_ACP, 0, (LPCSTR)Title, -1, (LPWSTR)wstrTitle, nLen); msndata.dwData = 0x547; msndata.lpData = (void*)wstrTitle; msndata.cbData = (nLen*2)+2; do { USES_CONVERSION; msnui = ::FindWindowEx(NULL, msnui,A2W("MsnMsgrUIManager"), NULL); if (msnui != NULL) ::SendMessage(msnui, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&msndata); }while(msnui !=NULL); delete strRet; return S_OK; }
Donc en gros, je demande de creer un objet activex a chaque fois que je veux appeller la DLL msn, c'est peut etre pour cela que ca foire au bout d'un moment ??? J'ai essayé d'ajouter un 'delete obj' a la fin mais ca marche pas mieux.function SendToMSN(txt,show)
{
var obj = new ActiveXObject("DLLMSN.clsDLLMSN");
obj.SendMessageMSN(txt,show);
}
Je suis sur a 100% que le probleme vient du javascript (ou de la DLL mais franchement je vois pas de probleme de leak ici) car si je n'utilise pas l'appel de la DLL via le javascript depuis FLEX je n'ai aucun probleme de plantage sous le volet windows vista.
En espérant avoir été assez clair... Si vous avez des idées, je suis preneur. Merci d'avance
Partager