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..

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;
}
Par contre, la fonction javascript appellée depuis FLEX est la suivante :

function SendToMSN(txt,show)
{
var obj = new ActiveXObject("DLLMSN.clsDLLMSN");
obj.SendMessageMSN(txt,show);
}
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.

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