Section courante

A propos

Section administrative du site

 Langage  Tutoriel  Programmation  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Déclarations d'API
Géographie
Distance en Km entre deux longitudes et latitudes
EXE, DLL et modules pour Windows
API pour Windows
Préface
Notes légal
Dictionnaire
Recherche

Déclarations d'API

Comme vous le savez sans doute, l'API de Windows contient plus de 2 000 fonctions. Bien sûr, puisque l'API est destinée à être utilisée dans l'environnement VC++, toutes les déclarations sont par défaut dans le langage Visual C++ (c'est-à-dire le langage C++ avec les extensions VC++ de Microsoft). Voici un exemple de déclaration d'API tirée de la documentation Win32 sur le CD du MSDN Library :

  1. LRESULT SendMessage(
  2.  HWND hWnd,      // Identificateur de descripteur de la fenêtre de destination
  3.  UINT Msg,       // Message à envoyer
  4.  WPARAM wParam,  // Premier paramètre de message
  5.  LPARAM lParam,  // Deuxième paramètre de message
  6. );   

Une traduction possible en VB (et il y en a d'autres) est :

  1. Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
  2.    ByVal hWnd As Long, _
  3.    ByVal hMsg As Long, _
  4.    ByVal wParam As Long, _
  5.    ByRef lParam As Any) _
  6. As Long

Pour y arriver, vous devez connaître quelques principes de base pour réaliser de telles traductions. Nous supposerons que vous êtes familiarisé avec les concepts de passage de paramètres par valeur et par référence. Pour plus de commodité, nous ferons référence à toute procédure (fonction ou sous-programme) résidant dans une DLL et destinée à l'exportation en tant que fonction externe. (La procédure est externe à l'application VB appelant cette fonction.)

L'instruction Declare de Visual Basic

L'instruction Declare de Visual Basic est utilisée pour appeler des fonctions externes résidant dans des DLL. L'instruction doit être utilisée au niveau du module, plutôt qu'au niveau de la procédure. Il existe deux syntaxes - une pour les fonctions et une pour les sous-programmes :

[Public | Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]

et :

[Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]

où les éléments entre crochets sont facultatifs et la barre indique des choix alternatifs.

Public ou Private

Lors de l'utilisation de l'instruction Declare dans un module de code standard, nous pouvons utiliser le mot clef Public pour rendre la fonction accessible à l'ensemble du projet Visual Basic. Dans un module de formulaire ou de classe, cependant, nous devons utiliser Private ou Visual Basic se plaindra.

Nom de l'appelant

Le mot-clef name doit être remplacé par le nom de la fonction, comme nous avons l'intention d'appeler à partir de notre code Visual Basic. Comme nous le verrons, il y a parfois de bonnes raisons pour que ce nom diffère du nom réel de la fonction tel que défini dans la DLL. Pour utiliser un nom différent, nous devons utiliser la syntaxe Alias, décrite ci-dessous. Il est important de noter que, contrairement aux noms en Visual Basic, les noms de fonctions DLL sont sensibles à la casse (comme tout dans le langage VC++) !

La bibliothèque Expert

La phrase :

Lib "libname"

est utilisé pour indiquer la DLL source exportant la fonction. Pour les appels d'API de Win32, il s'agit généralement (mais pas toujours) de l'un des trois grands DLL maîtresse :

Pour les trois DLL, vous pouvez omettre l'extension .DLL dans libname, comme nous l'avons fait dans l'exemple plus haut.

Alias

Comme mentionné, il y a plusieurs raisons pour appeler une fonction DLL en utilisant un nom différent de son vrai nom, tel que défini dans la DLL. Cela se fait à l'aide du mot clef Alias. Voici trois raisons convaincantes d'utiliser des alias.

Éviter les mots clefs Visual Basic et les caractères illégaux

Certaines fonctions API ont les mêmes noms que les fonctions Visual Basic. La fonction SetFocus en est un bon exemple :

  1. HWND SetFocus(HWND hWnd);

Nous ne pouvons pas déclarer cela dans Visual Basic comme ceci :

  1. Declare Function SetFocus Lib "user32" (ByVal hWnd As Long) As Long

car SetFocus est un mot-clef Visual Basic. Mais nous pouvons le déclarer comme ceci :

  1. Declare Function SetFocusAPI Lib "user32" Alias "SetFocus" (ByVal hWnd As Long) As Long

De plus, certaines fonctions API utilisent des caractères n'étant pas autorisés dans Visual Basic, comme les fonctions de fichier _hread, _hwrite, _lclose,..., commençant par un trait de soulignement. Nous pouvons mettre un alias sur ces noms en omettant le premier trait de soulignement. Heureusement, peu de fonctions API sont des mots-clefs Visual Basic ou contiennent des caractères illégaux, mais lorsque cela se produit, nous ne pourrions pas les utiliser dans Visual Basic sans les alias.

ANSI versus Unicode

Les fonctions d'API de Win32 utilisant des paramètres de chaîne de caractères sont généralement disponibles en deux versions : une pour ANSI et une pour Unicode. La fonction SendMessage définie au début de la page en est un bon exemple. Il existe en fait deux fonctions SendMessage différentes définies dans la bibliothèque USER32.DLL. La version ANSI est appelée SendMessageA et la version Unicode est appelée SendMessageW (le W est pour wide ou large). Dans le jargon, nous dirions qu'il existe deux points d'entrée pour la fonction SendMessage. Plutôt que de saupoudrer notre code avec As ou Ws, il est plus logique de faire le choix une fois dans la déclaration, puis d'utiliser le mot sans ornement SendMessage dans tout le code. D'une part, cela simplifierait les futurs changements. Comme nous l'avons dit, Windows NT prend en charge Unicode. Il met en oeuvre donc les points d'entrée Uncode pour les fonctions API ayant des paramètres de chaîne de caractères. Pour des raisons de compatibilité, Windows NT met en oeuvre également les points d'entrée ANSI, mais ces mises en oeuvre effectuent généralement les conversions nécessaires, appellent la version Unicode correspondante de la fonction et reconvertissent en ANSI !

D'un autre côté, Windows 9x ne prend généralement pas en charge Unicode, sauf dans certaines situations limitées. Selon Microsoft : «Windows 95 n'implémente pas la version Unicode (ou caractères larges) de la plupart des fonctions Win32 acceptant des paramètres de chaîne de caractères. À quelques exceptions près, ces fonctions sont implémentées sous forme de stubs renvoyant simplement le succès sans modifier aucun paramètre.»

Cela semble plutôt mal avisé. Ne serait-il pas préférable de renvoyer une valeur n'indiquant pas de succès lorsque la fonction n'a rien fait ? Dans tous les cas, il existe quelques exceptions à cette règle. En particulier, Windows 9x prend en charge le point d'entrée Unicode dans les fonctions API liées à OLE, ainsi qu'une poignée d'autres fonctions API, comme indiqué dans le tableau suivant :

De plus, Windows 9x met en oeuvre deux fonctions de conversion : MultiByteToWideChar et WideCharToMultiByte.

Prenons particulièrement note du fait que Windows 9x met en oeuvre la version Unicode de lstrlen (s'appelant lstrlenW). La fonction renvoie le nombre de caractères dans un tableau de caractères Unicode terminé par null. La meilleure marche à suivre pour un programmeur VB est simplement d'appeler les points d'entrée ANSI, car ils sont compatibles avec Windows 9x et Windows NT.

Déclarations de type de paramètre

La troisième raison d'utiliser des alias concerne les déclarations de type des paramètres dans une instruction Declare. Grâce au alias, nous pouvons vouloir déclarer plusieurs versions d'une seule fonction externe en utilisant différents types de données pour certains des paramètres. Une raison à cela est de tirer parti des capacités de vérification de type de Visual Basic pour détecter les erreurs de déclaration de type avant qu'elles n'atteignent la DLL, alors qu'elles provoqueront probablement une erreur GPF (General Protection Fault). Pour ce faire, nous devrons utiliser des alias.

Liste des paramètres

Le paramètre arglist est une liste de paramètres et de leurs types de données. Sa syntaxe (simplifiée) est :

[ByVal | ByRef] varname[( )] [As type]

où les parenthèses facultatives suivant varname sont requises pour les variables de tableau. Le mot-clef type peut être l'un des suivants : Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (longueur de variable seulement), Variant, définit par l'utilisateur, ou objet (en fait, des chaînes de caractères de longueur fixe peuvent apparaître comme paramètres de procédure, mais ils sont convertis en chaînes de caractères de longueur variable avant d'être passés à la fonction.)

Le plan de jeu de traduction VC-à-VB

De manière générale, la traduction d'une déclaration de fonction API de style VC++ en VB implique les étapes suivantes :

Parmi toutes ses étapes, il ne fait aucun doute que la partie la plus difficile du processus de traduction est le processus de traduction du type de données des paramètres.

Passage de paramètres à une fonction externe

La procédure pour les déclarations de paramètres et le passage de paramètres pour les fonctions DLL externes est assez similaire à celle des fonctions Visual Basic ordinaires, sauf dans trois cas : les chaînes, les adresses et les structures (types définis par l'utilisateur). Cependant, la gestion des chaînes et des structures implique simplement la gestion des adresses, donc tout se résume à des adresses, c'est-à-dire à des pointeurs.

La chose la plus importante à retenir à propos de la déclaration de paramètres et du passage de paramètres en ce qui concerne les fonctions DLL externes est que nous sommes vraiment en conflit avec deux déclarations - la définition de la déclaration dans la DLL ainsi que la déclaration Visual Basic dans l'instruction Declare. Notre travail consiste à faire correspondre l'instruction Declare de Visual Basic à la déclaration DLL de définition.

En particulier, il est important de garder à l'esprit que tous les mots clefs ByVal et ByRef apparaissant dans une instruction Declare sont des instructions destinées à Visual Basic et non à la DLL.



PARTAGER CETTE PAGE SUR
Dernière mise à jour : Mardi, le 29 décembre 2020