L'API de Windows est incohérente !!!!!

Oui vous devez déjà le savoir, mais je m’en suis aperçu lors d’un projet en relation avec mon travail.
ils définissent une structure pour un Pen style.
typedef struct tagLOGPEN {
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
} LOGPEN;

mais leur fonction est:
HPEN CreatePen(
int fnPenStyle, // pen style
int nWidth, // pen width
COLORREF crColor // pen color
);

chercher l’erreur…
Ben oui leur pen width est défini comme un int32 dans la fonction d’accès alors que dans leur structure c’est un POINT => hauteur/largeur.

Je peux même pas imaginer les bugs que ça peut donner (moi j’en ai eu déjà un gros à cause de cela).
Et si dans toute leur API c’est la même chose…

  1. La structure POINT n’a probablement pas été choisie au mieux (probablement qu’elle a été choisie pour permettre des extensions futures). Néanmoins, la doc dit clairement:
    Specifies the POINT structure that contains the pen width, in logical units. If the pointer member is NULL, the pen is one pixel wide on raster devices. **The y member in the POINT structure for lopnWidth is not used.**
    Il y avait nettement plus facile/flagrand:
    – PenStyle est UINT d’un côté et int de l’autre
    – Width est LONG d’un côté, int de l’autre

    Sinon, je dirais que beaucoup de gens pense que l’API Windows est incohérente, juste parce qu’elle n’a pas été parfaite du premier coup, et que certaines évolutions se sont fait selon des tendances nouvelles. Le problème est que de nombreuses fonctions existent encore pour des raisons historiques (si un soft fonctionne sur la version n de windows, il devrait aussi fonctionner sur la n+1, quoi que ce n’est plus respecté ces dernières années).
    Ex. si pour windows 3.1 on ne pensait pas forcément à “comment coder secure”, forcément les définitions d’API n’étaient pas pensées de la sorte (fonctions qui retournent des buffers sans garantie sur la taille, etc.). Tandis que les nouvelles versions sont pensées pour qu’il n’y ait pas de buffer overrun.

    Evidemment, dans la mesure ou de nombreuses applications win3.1 ne sont plus compatibles, on peut se demander s’il est légitime de les conserver… J’éviterai de débattre, mais mon opinion est que pour les quelques applications encore compatibles, quand ça n’implique pas de faille de sécurité, ça vaut la peine.

  2. Je comprends leur attitude vis à vis de la compatibilité, ce que je comprends moins c’est la façon de penser.
    On ne peut pas faire un API public sans penser à la cohérence.
    Suffit de voir ce que fait TT. Ce n’est pas parfait certes mais au moins il y a une cohérence.
    Mais bien sur comme MS a décidé de garder une compatibilité depuis Windows 3.1 et peut être avant ils doivent vivre avec cela et les developpeurs aussi.
    Mais un jour faudrait penser à faire le ménage.

  3. La façon de penser sera forcément différente d’un OS à un autre. Chaque OS a ses particularités, ses qualités, ses défauts, ses objectifs, etc…
    D’après ma petite expérience, je remarque que la plupart du temps, les personnes veulent utiliser les outils d’un autre OS de la même façon que celle dont ils ont l’habitude. Cela provoque des conflits d’idées. En se plaçant un peu plus dans le contexte de l’OS, je pense que l’on comprend mieux comment fonctionne les choses, pourquoi les choses sont de telles façons.

    Ce que tu vois comme problème de conception ne l’était peut-être pas il y a quelques années. Beaucoup de problèmes de ce type sont historiques. On a pris une décision à un moment X qui était sans doute la meilleure à ce moment X avec le contexte A, mais elle parait totalement étrange à un moment Y avec le contexte B.

    On retrouve ces problèmes dans les API qui ont une histoire longue. Je pense que ça ne doit pas etre une mince affaire de faire évoluer une API dans le temps avec les différentes contraintes que cela impose. Mais je suis d’accord avec le fait qu’il faille faire le ménage de temps en temps. Encore faut-il le faire prudemment et correctement afin que les changements aient le moins d’impacte négative sur les utilisateurs.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>