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 :
- 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.) :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;
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.