Salut,

je suis victime d'un plantage (StackOverflow) au moment de faire appel la méthode InvokeHelper pour exécution d'une des fonctions d'un ActiveX.

Methode appelée : (généré par le wizard)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
short MonOCX::MaFonction(LPCTSTR DataStr)
{
	short result;
	static BYTE parms[] =
		VTS_BSTR;
	InvokeHelper(0x24, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
		DataStr);
	return result;
}
L'ID de la méthode (0x24) est bon, il se réfère à la bonne fonction de l'ActiveX.

En entrée on a une CString (DataStr), seul paramètre, défini dans le tableau de params par VTS_BSTR.

Le type de la valeur de retour (short) est bien défini : VT_I2.


Hors, l'application crash ligne 252 dans oledisp2.cpp au moment d'un SysAllocString()... Mais pourquoi ? Les paramètres sont pourtant correct.

OleDisp2.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
#if !defined(_UNICODE) && !defined(OLE2ANSI)
			case VT_BSTRA:
				{
					LPCSTR lpsz = va_arg(argList, LPSTR);
					pArg->bstrVal = ::SysAllocString(T2COLE(lpsz));
					if (lpsz != NULL && pArg->bstrVal == NULL)
						AfxThrowMemoryException();
					pArg->vt = VT_BSTR;
				}
				break;
#endif
On peut voir que la chaine subit une conversion (vers du wild vraissemblablement) via la macro A2W (ATLCONV.H).

Le fait que le crash survienne dans les fichiers MFC, ne laisse guère de marge de manœuvre...

Bref, je sèche quant à l'origine de ce crash...

Merci d'avance.

Pierre.

NB:
Config : VC6