juin
2007
Le billet précédent présente une méthode qui simplifie grandement l’écriture de notre programme natif qui utilise un objet managé via COM Interop.
La contrainte qu’il rajoute est la transformation des signatures des méthodes à la sauce COM.
Ainsi, une méthode :
String^ ReadLine();
sera wrappée en
HRESULT ReadLine(/*[out,retval]*/ BSTR);
Ce qui suggère l’utilisation de la macro SUCCEEDED pour tester la bonne marche de la fonction.
Mais pouvons-nous encore simplifier et se passer de ce type de signature ? On aimerait pouvoir avoir une signature du genre :
BSTR ReadLine();
Bref, conserver la signature de la méthode, aux types près …
Et bien c’est possible, grâce à un attribut disponible dans le namespace System::Runtime::CompilerServices.
Notre classe managée ne change pas d’écriture, mais l’interface sera écrite ainsi :
namespace MonStreamReader
{
public interface class IClassWrap
{
[MethodImpl(MethodImplOptions::PreserveSig)]
void SetFile(String ^fileName);
[MethodImpl(MethodImplOptions::PreserveSig)]
bool Create();
[MethodImpl(MethodImplOptions::PreserveSig)]
String^ ReadLine();
};
public ref class ClassWrap : IClassWrap
{
.........
}
}
L’attribut PreserveSig, comme son nom le suggère un peu, permet de préserver la signature ; et au final de simplifier encore un brin le programme natif.
{
CoInitialize(NULL);
MonStreamReader::IClassWrapPtr pClass(__uuidof(MonStreamReader::ClassWrap));
CComBSTR filePath = "c:\\test.txt";
pClass->SetFile(filePath);
if (pClass->Create())
{
CComBSTR line;
line = pClass->ReadLine();
while (line)
{
_bstr_t line_(line);
std::cout << line_ << std::endl;
line = pClass->ReadLine();
}
}
return 0;
}
Dingue ca, on dirait presque du C++/CLI :p, à part un ou deux BSTR qui trainent …
Un dernier petit truc : ne faites pas trop confiance à l’intellisense, il se débrouille pas trop mal, mais suite à quelques compilations, enregistrements, … dès fois, il pert un peu le nord. Heureusement que nous savons exactement ce que nous voulons faire
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007