Compatibilité entre les logiciels 16 bits et 32 bits

(retour au menu)
(16 bits = Win 31, 32 bits = Win95-98)

Vers 1994, j'ai commencé à  programmer les DLL de mesure. A l'époque, c'était avec Win3.1 et Borland Pascal 7 pour Windows..
Peu de temps après, j'ai commencé à programmer en Delphi 1, et j'ai constaté avec plaisir que les programmes écrits dans un langage étaient compatibles avec les DLL écrites dans un autre. Ces DLL étaient aussi appelables par les tableurs Excel 2 et QuattroPro pour Windows 5.
J'en ai déduit naïvement que les DLL étaient universelles...
Espoir déçu !
Avec Windows 95 et 98, qui fonctionnent en 32 bits, ces DLL ne fonctionnent plus du tout. On obtient systématiquement un message d'erreur, que ce soit en appelant ces DLL par un programme écrit en Delphi 5 ou en Visual Basic 6, ou bien en les appelant par un tableur conçu pour Win95 (QPW 7, par exemple).

Je n'ai pas très bien compris le fond du problème mais l'essentiel est là :
On ne peut pas utiliser les DLL 16 bits (Win3x) avec des programmes 32 bits (Win 95-98) et inversement, à moins d'utiliser des astuces de programmation.

Conclusion : il faut refaire des DLL spéciales...
Et comme la programmation en Win 32 bits n'est pas identique à celle en Win 16 bits, il ne suffit pas de recompiler le programme, mais il faut parfois le modifier notablement.
Par exemple :
- Sous DOS classique, et sous Win3x, on accédait directement aux ports en Pascal par l'instruction port[adresse]. C'est impossible en 32 bits, et il faut faire un couple de fonctions spéciales :

procedure SetPort(address,value:Word);
var bvalue:byte;
begin
   bvalue:=trunc(value and 255);
   asm
      mov dx,address
      mov AL,bvalue
      out DX,AL
   end;
end;

function GetPort(address:Word):Word;
var bvalue:byte;
begin
   asm
      mov dx,address
      in aL,dx
      mov bvalue,aL
   end;
   result:=bvalue;
end;

- Pour être utilisables par Visual Basic 6, il faut que les fonctions déclarées dans la DLL le soient avec l'instruction stdcall, par exemple (Merci à  E. Ch.) :
function EA(n:integer):integer;stdcall;export;
Par contre, les DLL compilées avec cette option stdcall provoquent un plantage du logiciel qui essaie de les charger, lorsque celui-ci est fait par Delphi 5 (mon langage de programmation préféré...).

- quand il y a des fonctions en assembleur dans des fichiers ASM, assemblés en fichier OBJ par TASM32, il faut aussi indiquer que la compilation se fait en 32 bit...

Bref, rien n'est simple, tout se complique... et il faut refaire tout le travail...

C'est pourquoi sur ce site, en plus des DLL 16 bits utilisables par MesurWin et Mesugraf pour Windows, j'ai commencé à mettre des DLL 32 bits, pour les futurs logiciels en 32 bits.