Wednesday, March 30, 2005

Travaillant actuellement pour un client désirant utiliser un composant .NET depuis Office 2000, il a donc fallu s'attaquer à COM Interop. Et, bien que la documentation le dise, il est possible d'avoir quelques surprises lorsqu'il s'agit de gérer les exceptions et les erreurs COM.


Prenons donc le code suivant :


[ComVisible(true)]
public int myMethod()
{
  // snip
  throw new myException("Description", 2500);
  // snip
  // Do something here
  return 0;
}


public class myException : ApplicationException
{
  // COM Error base number is 0x80040000
  private const int kCOMErrorBaseNumber = unchecked((int) 0x80040000);
  public myException() : base(){}
  public myException(string strMessage, int ErrorCode) : base(strMessage)
  {
    // HResult = kCOMErrorBaseNumber + ErrorCode);
    HResult = ErrorCode);
  }
}


Du côté client, par exemple sous Excel, en ajoutant la bonne référence sur notre composant COM écrit en .NET, écrivons le code suivant :


Sub Test()
  On Error GoTo err_handling
  Dim a As New myDotNetComponent
  Dim b As Long
  b = a.myMethod()
  ' Do something
  Exit Sub

err_handling:
  MsgBox Err.Number
End Sub


Le seul moyen de fixer le numéro d'erreur qui sera retourné au client COM est de le faire dans le constructeur de l'exception, comme on peut le voir dans le code du composant COM. Si on exécute le code VB, aucune erreur ne sera retournée. Le code situé sous l'étiquette err_handling n'est pas exécuté. Surprise, non ?


L'explication se trouve dans la documentation Microsoft. On peut y lire qu'un code d'erreur HRESULT doit avoir son bit de poids fort mis à 1 pour que ce soit considéré pour une erreur. Ainsi donc, même si une exception est levée dans le composant COM .NET et qu'elle est propagée au-delà vers le code client, si le code HRESULT affecté n'est pas correct, on risque de passer à côté d'un tel problème. Il est possible de corriger cela en ajoutant la valeur 0x80000000 à notre code d'erreur pour que cela fonctionne. Pour être plus sûr de ne pas entrer en collision avec des code existants, j'ai ajouté la valeur 0x80040000.


 


Actually working for a customer which would like to use a .NET component from an Office 2000 application, I had to work with COM Interop. And, even the documentation understandable, it is possible to have some surprises when managing and handling exceptions and COM errors.


So, take the following code :


[ComVisible(true)]
public int myMethod()
{
  // snip
  throw new myException("Description", 2500);
  // snip
  // Do something here
  return 0;
}


public class myException : ApplicationException
{
  // COM Error base number is 0x80040000
  private const int kCOMErrorBaseNumber = unchecked((int) 0x80040000);
  public myException() : base(){}
  public myException(string strMessage, int ErrorCode) : base(strMessage)
  {
    // HResult = kCOMErrorBaseNumber + ErrorCode);
    HResult = ErrorCode);
  }
}


On the client side, for exemple from Excel, adding the right reference to our .NET written COM component, write the following code :


Sub Test()
  On Error GoTo err_handling
  Dim a As New myDotNetComponent
  Dim b As Long
  b = a.myMethod()
  ' Do something
  Exit Sub

err_handling:
  MsgBox Err.Number
End Sub


The only way to set the error code that will be returned to the COM client is to do that in the exception constructor as we can see it in the COM component code. If we run the VB code, no error will be returned and the err_handling labelled code will not be run. Surprising isn't it ?


The explanation can be found in the Microsoft documentation. We can read that an HRESULT error code must have its high-order bit must be set to 1 to be considered as en error. So, even en exception is raised in the .NET COM component and bubbled to the client code, if the HRESULT code is not correctly set, we can miss an error. It is possible to change that adding a 0x80000000 value to our error code. But, to be sure that we are not colliding with existing error codes, I added the value 0x80040000.

Monday, March 21, 2005

Selon le communiqué de presse de Microsoft, Visual Studio 2005 arrivera en 4 goûts différents :



  • Professional Edition à $799

  • Tools for Office à $799

  • Standard Edition à $299

  • Express Edition qui n'est donc pas gratuit, contrairement à ce qu'il se disait, mais qui sera vendu à $49.

 


According to the today's Microsoft press release, Visual Studio 2005 will arrive in 4 different flavours :



  • Professional Edition at $799

  • Tools for Office at $799

  • Standard Edition at $299

  • Express Edition which will not be free as we could hear before, but sold at $49.

Le match démarrait mal, aucun arbitre ne serait présent. Conclusion, un auto-arbitrage ce qui laissait présager quelques dérapages.


Les Balous entamèrent donc ce match en allumant par 2 fois la lampe rouge d'entrée. Puis, quelques minutes plus tard, ils reprirent une longueur d'avance de plus avant que le Royal ne parviennent à trouver la faille.


Au second tier, ce fut nettement plus musclé, les Balous se faisant remonter, les coups devenaient plus durs.


Au dernier tier, la chaleur est encore montée d'un cran. A 4 partout, le match pouvait basculer d'un côté comme de l'autre. Pourtant, à 10 minutes de la fin du match, Michel Harvey se fait sécher par un coup de canne au visage. Résultat : nez cassé et plusieurs points de suture. Le match a tout de même continué avant d'être prématurément terminé par décision de l'arbitre voyant un jeu de plus en plus hâché.


1 point partout, mais est-ce que ce sera suffisant pour que le Royal reprenne la 3ème place du championnat ?

Thursday, March 10, 2005

Vitoire 8 à 5 hier soir du Royal sur les Red Lion's.


Malgré une avance de 4 buts durant le match, l'équipe locale a joué à se faire peur en laissant revenir les Lions à 5 partout. Pourtant, et malgré une pénalité de 10 minutes infligée à Pierre Côté, le RHC a su presser la défense adverse et marquer par trois fois, sellant le score à 8 à 5.


2 points supplémentaires qui permettent au Royal de se mettre à l'abri d'un retour de l'équipe suivante au classement et ainsi assurer une 4ème place finale.

Wednesday, March 02, 2005


Chandu Thota propose une application sympa permettant de localiser l'auteur d'un blog. Pour ceci, il suffit d'entrer l'URL de son site ou son blog ainsi que son adresse. Blogmap (le nom de cette application) génère donc l'image appropriée, grâce à Microsoft MapPoint


 


From the Chandu Thota's site, it is possible to get the geographic position of a blogger. For that, you have to go on his site and enter your site or blog URL with your physical address. The Blogmap application (this is its name) generates the picture for you in collaboration with Microsoft MapPoint.

Le RHC semblait pourtant en bonne voie pour conserver sa 3ème place au classement de la ligue lausannoise. C'était sans compter sur le HC Boulon qui a joué les troubles fêtes. Battus 11 à 1 au match aller, le Royal comptait bien laver l'affront.


C'est donc avec une équipe redoutable que les visiteurs arrivèrent en cette soirée du 1er mars. Cependant, les Boulon ouvrèrent le score semant de suite le trouble parmis les joueurs du Royal HC. Ceux-ci retrouvèrent leurs esprits et réussirent à mener 1 à 4 durant un bon moment.


Et pourtant, au début du 2ème tier, quelques stupidités firent perdre pieds au Royal. Les Boulons en profitèrent pour égaliser, puis mener de deux longueurs. Jouant la fin du match à deux lignes, le RHC ne put marquer qu'un but supplémentaire et terminer ainsi sur le score de 5 à 6.


Défaite rageante, d'autant plus que le Royal a mené un bon moment de la partie.