Bonsoir,

J'ai crée un composant COM en C++ et ce composant est utilisé dans un programme C#. Tout cela fonctionne plutôt bien.
Pour que le C# envoye des informations a mon composant il utilise les fonctions de mon IDL, pour que la communication soit faite dans l'autre sens j'utilise des points de connexion.
Ceux-ci sont géré comme des évènements dans le code C#, et sa marche ! Mais voila j'aimerai lever un évènement en passant un pointeur de BSTR en paramètre pour que le C# le met à jour et au retour de la fonction je puisse récupérer cette chaine modifié. Mais voila cet argument n'est pas modifié.

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
//IDL
dispinterface _IEngineEvents
{
	methods:
        [id(1)] HRESULT getFileName([out] BSTR* moduleName);
};
//Code C++ 

void fire()
{
        CComVariant* pVars = new CComVariant[1];
        pVars[0] = ::SysAllocString( TEXT("STRING_TEST") );

	CComVariant varResult;
	int s = m_vec.GetSize();
	for (int nConnectionIndex=0;nConnectionIndex<s; nConnectionIndex++)
	{
		Lock();
		CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
		Unlock();
		IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
		if ( pDispatch )
		{
			VariantClear(&varResult);
			DISPPARAMS disp = { pVars, NULL, size, 0 };
			pDispatch->Invoke( 1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
		}
	}
        //ICI pVars[0] est tjrs egale à STRING_TEST
}
//Code C#
void _engine_getFileName(out string moduleName) //On a bien le parametre out
{
    moduleName = "Hello world";
}
Merci d'avance pour toute infos !