- Contrôles effectués
- Gestion des erreurs
- Chargement et déchargement de la DLL
- Paramètres à passer à la fonction de la DLL
- Passer une chaîne à une API ou récupérer une chaîne en retour d'une API
- Passer une structure à une API
- Passer une structure contenant une chaîne à une API
- Procédure appelée en CallBack
- Divers
API (Fonction) En anglais : API Exécute une fonction présente dans une DLL externe. Cette fonction peut être une fonction de l'API Windows. Les fonctions accessibles par API sont par exemple les fonctions des librairies standard de Windows (USER32, KERNEL32, GDI32, etc.). La fonction peut être identifiée par : - son nom.
- son numéro.
- son adresse.
Il est également possible d'utiliser une variable de type Description d'API. Pour les API appelées plusieurs fois dans une même application ou utilisant des paramètres de types spécifiques, il est conseillé d'utiliser une variable de type Description d'API avec une utilisation directe (sans passer par la fonction API). Remarques : - Cette fonction est identique à la fonction AppelDLL32.
- Si la fonction à exécuter possède des paramètres de type QWORD, il est nécessaire d'utiliser une variable de type Description d'API (Syntaxe 4).
API("USER32", "SendMessageA", hWnd, wMsg, lParam1, lParam2) Syntaxe
Exécuter une fonction d'une DLL externe ou de l'API Windows identifiée par son nom Masquer les détails
<Résultat> = API(<Nom de la DLL> , <Nom de la fonction> [, <Paramètre 1> [... [, <Paramètre N>]]])
<Résultat> : Entier sur 4 en 32 bits, entier sur 8 en 64 bits Résultat de l'exécution de la fonction <Nom de la fonction>. Ce résultat peut être un code d'erreur. Le type de ce résultat dépend de la fonction exécutée. Consultez la documentation de cette fonction pour obtenir plus de détails. Si le résultat de la fonction est d'une taille supérieure à la taille de l'entier de la plateforme, il ne pourra pas être récupéré. <Nom de la DLL> : Chaîne de caractères Nom de la librairie (DLL) qui contient la fonction à exécuter. <Nom de la fonction> : Chaîne de caractères Nom de la fonction à exécuter. Cette fonction doit être présente dans la DLL spécifiée. <Paramètre 1> : Type correspondant au paramètre Premier paramètre à passer à la fonction. Ces paramètres doivent être du même type que les paramètres attendus par la fonction. Sont utilisables : - les types "simples" (voir Remarques),
- les structures (voir Remarques),
- un nom de procédure WLangage. Cette procédure sera rappelée par la fonction de la DLL (voir Remarques).
<Paramètre N> : Type correspondant au paramètre Nième paramètre à passer à la fonction. Ces paramètres doivent être du même type que les paramètres attendus par la fonction. Sont utilisables : - les types "simples" (voir Remarques),
- les structures (voir Remarques),
- un nom de procédure WLangage. Cette procédure sera rappelée par la fonction de la DLL (voir Remarques).
Exécuter une fonction d'une DLL externe ou de l'API Windows identifiée par son numéro Masquer les détails
<Résultat> = API(<Nom de la DLL> , <Numéro de la fonction> [, <Paramètre 1> [... [, <Paramètre N>]]])
<Résultat> : Entier sur 4 en 32 bits, entier sur 8 en 64 bits Résultat de l'exécution de la fonction <Nom de la fonction>. Ce résultat peut être un code d'erreur. Le type de ce résultat dépend de la fonction exécutée. Consultez la documentation de cette fonction pour obtenir plus de détails. Si le résultat de la fonction est d'une taille supérieure à la taille de l'entier de la plateforme, il ne pourra pas être récupéré. <Nom de la DLL> : Chaîne de caractères Nom de la librairie (DLL) qui contient la fonction à exécuter. <Numéro de la fonction> : Entier Numéro de la fonction à exécuter. Cette fonction doit être présente dans la DLL spécifiée. <Paramètre 1> : Type correspondant au paramètre Premier paramètre à passer à la fonction. Ces paramètres doivent être du même type que les paramètres attendus par la fonction. Sont utilisables : - les types "simples" (voir Remarques),
- les structures (voir Remarques),
- un nom de procédure WLangage. Cette procédure sera rappelée par la fonction de la DLL (voir Remarques).
<Paramètre N> : Type correspondant au paramètre Nième paramètre à passer à la fonction. Ces paramètres doivent être du même type que les paramètres attendus par la fonction. Sont utilisables : - les types "simples" (voir Remarques),
- les structures (voir Remarques),
- un nom de procédure WLangage. Cette procédure sera rappelée par la fonction de la DLL (voir Remarques).
Exécuter une fonction d'une DLL externe ou de l'API Windows identifiée par son adresse Masquer les détails
<Résultat> = API(<Adresse de la fonction> [, <Paramètre 1> [... [, <Paramètre N>]]])
<Résultat> : Entier sur 4 en 32 bits, entier sur 8 en 64 bits Résultat de l'exécution de la fonction <Nom de la fonction>. Ce résultat peut être un code d'erreur. Le type de ce résultat dépend de la fonction exécutée. Consultez la documentation de cette fonction pour obtenir plus de détails. Si le résultat de la fonction est d'une taille supérieure à la taille de l'entier de la plateforme, il ne pourra pas être récupéré. <Adresse de la fonction> : Entier Adresse en mémoire de la fonction à exécuter. <Paramètre 1> : Type correspondant au paramètre Premier paramètre à passer à la fonction. Ces paramètres doivent être du même type que les paramètres attendus par la fonction. Sont utilisables : - les types "simples" (voir Remarques),
- les structures (voir Remarques),
- un nom de procédure WLangage. Cette procédure sera rappelée par la fonction de la DLL (voir Remarques).
<Paramètre N> : Type correspondant au paramètre Nième paramètre à passer à la fonction. Ces paramètres doivent être du même type que les paramètres attendus par la fonction. Sont utilisables : - les types "simples" (voir Remarques),
- les structures (voir Remarques),
- un nom de procédure WLangage. Cette procédure sera rappelée par la fonction de la DLL (voir Remarques).
Exécuter une fonction d'une DLL externe ou de l'API Windows identifiée par une variable de type Description d'API Masquer les détails
<Résultat> = API(<API à  exécuter> [, <Paramètre 1> [... [, <Paramètre N>]]])
<Résultat> : Entier sur 4 en 32 bits, entier sur 8 en 64 bits Résultat de l'exécution de la fonction <API à exécuter>. Ce résultat peut être un code d'erreur. Le type de ce résultat dépend de la fonction exécutée. Consultez la documentation de cette fonction pour obtenir plus de détails. Si le résultat de la fonction est d'une taille supérieure à la taille de l'entier de la plateforme, il ne pourra pas être récupéré. <API à exécuter> : Variable de type Description d'API Variable de type Description d'API contenant les caractéristiques de la fonction à exécuter. <Paramètre 1> : Type correspondant au paramètre Premier paramètre à passer à la fonction. Ces paramètres doivent être du même type que les paramètres attendus par la fonction. Sont utilisables : - les types "simples" (voir Remarques),
- les structures (voir Remarques),
- un nom de procédure WLangage. Cette procédure sera rappelée par la fonction de la DLL (voir Remarques).
<Paramètre N> : Type correspondant au paramètre Nième paramètre à passer à la fonction. Ces paramètres doivent être du même type que les paramètres attendus par la fonction. Sont utilisables : - les types "simples" (voir Remarques),
- les structures (voir Remarques),
- un nom de procédure WLangage. Cette procédure sera rappelée par la fonction de la DLL (voir Remarques).
Remarques - La fonction API est protégée contre les "Erreurs de protection générale" dans la fonction appelée. Néanmoins, si une erreur de ce type se produit, une erreur WLangage est déclenchée.
- Pour les fonctions au prototype d'appel PASCAL (les fonctions de l'API Windows notamment), un contrôle sommaire du nombre de paramètres passés à la fonction est effectué. En cas de discordance, une erreur WLangage est déclenchée.
Lors de l'exécution de fonctions de l'API Windows, si le résultat renvoyé correspond à une erreur, utilisez la fonction ErreurInfo pour obtenir plus d'informations sur l'erreur (avec la constante errCodeSystème ou errMessageSystème). Chargement et déchargement de la DLL La fonction API charge automatiquement la DLL au besoin, puis la décharge (si elle l'a chargée). Ce mécanisme peut être très lent, sauf pour les DLL du système (KERNEL, USER, GDI). Pour optimiser la vitesse d'exécution, il est conseillé de charger une fois la DLL avec ChargeDLL, puis de la décharger avec DéchargeDLL lorsqu'elle n'est plus utilisée. Paramètres à passer à la fonction de la DLL Ces paramètres doivent être du même type que les paramètres attendus par la fonction. Les types utilisables sont les suivants : - Les types "simples" (entier, réel, et booléen). L'utilisation d'un autre type WLangage provoque une erreur du WLangage.
Si la fonction à exécuter attend un pointeur ou un handle Windows, utilisez un entier système. Si la fonction à exécuter attend une adresse, utilisez l'opérateur &. - Les types "chaîne".
- Les types structure.
- Un nom de procédure WLangage. Cette procédure sera rappelée par la fonction de la DLL (voir paragraphe ci-dessous).
Les paramètres dépendent de la fonction exécutée. Consultez la documentation de cette fonction pour obtenir plus de détails.
Passer une chaîne à une API ou récupérer une chaîne en retour d'une API - En paramètre d'entrée, utilisez le type chaîne.
Par exemple :
sChaîne est une chaîne API(<DLL>, <Fonction>, sChaîne) - En paramètre de sortie, le C n'est pas capable de gérer des chaînes dynamiques de manière simple. Il est donc nécessaire :
- soit de fixer une taille maximale, avec le type "Chaîne sur".
Par exemple :
sChaîne est une chaîne sur 100 API(<DLL>, <Fonction>, sChaîne) // dans Méthode en C : // STRNCPY(PointeurEnC, "Test", 100) - soit de récupérer les adresses des chaînes en C (mais dans ce cas, la partie de code en C doit assurer la "survie" des chaînes renvoyées), puis de transférer la chaîne dans une variable de type chaîne grâce à la fonction ChaîneRécupère.
Par exemple :
nAdresseChaîne est un entier système API(<DLL>, <Fonction>, &nAdresseChaîne) sChaîne est une chaîne sChaîne = ChaîneRécupère(nAdresseChaîne, crAdresseASCIIZ) // dans Méthode en C : *PointeurEnC = "Test"
- En valeur de retour, récupérer les adresses des chaînes en C (mais dans ce cas, la partie de code en C doit assurer la "survie" des chaînes renvoyées), puis transférer la chaîne dans une variable de type chaîne grâce à la fonction ChaîneRécupère.
Par exemple :
nAdresseChaîne est un entier système nAdresseChaîne = API(<DLL>, <Fonction>) sChaîne est une chaîne sChaîne = ChaîneRécupère(nAdresseChaîne, crAdresseASCIIZ) // dans Méthode en C : Return PointeurEnC
Passer une structure à une API Les structures peuvent être passées directement en paramètres aux API, sans passer par leur adresse. Pour cela, il suffit de passer en paramètre les membres de la structure un par un. Limite : Tous les membres de la structure doivent être alignés sur 4 octets. Passer une structure contenant une chaîne à une API - En entrée, le code à utiliser est le suivant :
Struct est une structure sChaîne est une chaîne FIN UneStruct est une Struct API(<DLL>, <Fonction>, &UneStruct) - En sortie, le C n'est pas capable de gérer des chaînes dynamiques de manière simple. Il est donc nécessaire de :
- soit fixer une taille maximale et faire une copie dans la mémoire du WLangage.
Par exemple :
sChaîne est une chaîne sur 100 Struct est une structure aChaîne est un entier FIN UneStruct est une Struct UneStruct:aChaîne = &sChaîne API(<DLL>, <Fonction>, &UneStruct) // dans Methode en C : // STRNCPY(StructEnC->PointeurEnC, "Test", 100) - soit récupérer les adresses des chaînes en C (mais dans ce cas, la partie de code en C doit assurer la "survie" des chaînes renvoyées).
Par exemple :
sChaîne est une chaîne Struct est une structure aChaîne est un entier FIN UneStruct est une Struct API(<DLL>, <Fonction>, &UneStruct) sChaîne = ChaîneRécupère(UneStruct:aChaîne, crAdresseASCIIZ) // dans Methode en C : StructEnC->PointeurEnC = "Test"
Procédure appelée en CallBack Certaines fonctions de l'API Windows attendent en paramètre l'adresse d'une procédure "CallBack" : cette procédure sera rappelée par la fonction de l'API. Par exemple : l'API EnumWindows permet d'énumérer toutes les fenêtres Windows ouvertes sur un poste. Cette fonction attend en paramètre l'adresse d'une procédure : cette procédure sera rappelée pour chacune des fenêtres trouvées. Remarque : Les procédures CallBack peuvent être utilisées en 32 bits comme en 64 bits. Pour utiliser une procédure callback en WLangage : 1. Créez la procédure callback dans votre projet Pour récupérer les paramètres, il faut décrire exactement les paramètres attendus par la fonction "CallBack". Dans le cas contraire, des "erreurs de protection générale" peuvent survenir. PROCEDURE <Nom de la procédure> (<Param1> est [un] <Type1>, ... <Param2> est [un] <Type2>) Remarques : - Les types doivent correspondre à ceux décrits dans la documentation de l'API.
- La convention d'appel des fonctions "CallBack" de la DLL doit être "stdcall" ou "cdecl". Par défaut, la convention d'appel est considérée comme étant "stdcall". Il est possible de déclarer une callback "cdecl" grâce à l'attribut d'extension "convention appel". Le prototype de la fonction devient :
PROCEDURE <Nom de la procédure> (<Param1> est [un] <Type1>, ... <Param2> est [un] <Type2>) <convention appel=CDECL> - Les paramètres sont obligatoirement passés par valeur. Pour récupérer un paramètre par référence :
- Utilisez un entier.
- Avec la fonction Transfert, récupérez ou affectez la véritable valeur.
2. Modifiez l'appel de la fonction en conséquence. Utilisez la syntaxe suivante : API(<Nom de la DLL>, <Nom de la fonction>, <Nom de la procédure CallBack>) Pour plus de détails, consultez l'exemple complet. Divers - Les fonctions API et AppelDLL32 ne bloquent pas les autres threads.
- Si la fonction de l'API appelée modifie les paramètres systèmes régionaux, les paramètres régionaux précédents sont restaurés.
La fonction APIParamètre permet de configurer le comportement par défaut de ces fonctions. Remarque : Jusqu'à la version 100045 : - Les fonctions API et AppelDLL32 bloquent les autres threads.
- Si la fonction de l'API appelée modifie les paramètres systèmes régionaux (langues, décimales, ...), les paramètres régionaux précédents ne sont pas restaurés.
Liste des exemples associés :
|
Exemples unitaires (WINDEV) : Chaînes avec des APIs
[ + ] Utilisation des chaînes avec des API. Les fonctions suivantes sont utilisées : - ChaîneRécupère - Transfert
|
|
Exemples didactiques (WINDEV) : WD APISystemes
[ + ] Cet exemple montre l'utilisation des Apis Windows. Différentes fonctions WLangage sont fournies et permettent d'effectuer les opérations suivantes : - Cacher les boutons système d'une fenêtre fille MDI - Enumérer les fenêtres ouvertes - Récupérer/Modifier le temps d'un double clic - Récupérer le temps d'inactivité sur le poste - Vider la corbeille (en utilisant ou non une variable de type "descripteur d'API") - Changer le fond d'écran - Modifier le caret (curseur de saisie) d'un champ de saisie - Partager un répertoire - Supprimer un partage Ces fonctions utilisent des APIs Windows. Veuillez consulter la fenêtre d'aide de l'exemple pour en avoir les spécificités.
|
|
Exemples didactiques (WINDEV) : WD Ecran de veille
[ + ] Cet exemple illustre la réalisation d'un économiseur d'écran avec les fonctions WLangage. Dans cet exemple, nous abordons les principaux thèmes suivants : 1/ l'appel périodique d'une procédure (les "timers") 2/ la gestion des événements Windows 3/ les fonctions système (appel d'API Windows) Pour utiliser l'écran de veille : - Renommer l'exécutable (.EXE) en .SCR - Copier le fichier dans le répertoire de Windows (Ex: C:\WINDOWS) - Ouvrir la fenêtre de propriétés d'affichage du bureau - Choisir l'onglet "Ecran de Veille" - Sélectionnez l'écran de veille généré avec WINDEV
|
|
Exemples didactiques (WINDEV) : WD DirectX
[ + ] DirectX est une collection de bibliothèques (ou API) destinées à la programmation d’applications multimédia. Cet exemple intègre un composant interne permettant d'utiliser DirectX 9.0 dans vos applications WINDEV. Toutes les APIs et interfaces de DirectX 9 ont été implémentées.
|
|
Exemples didactiques (WINDEV) : WD OSD
[ + ] OSD signifie : On-Screen Display. C'est le nom donné aux interfaces qui apparaissent sur les écrans d'ordinateur ou des téléviseurs par exemple. Ils servent souvent à effectuer des réglages. Ces types de menus ont comme particularité d'être affichés par dessus tout ce qui se trouve à l'écran. Cet exemple montre comment réaliser ce type d'interface sous WINDEV.
|
|
Exemples complets (WINDEV) : WD Loupe
[ + ] Cet exemple vous permet de zoomer une partie de l'écran grâce à une loupe visuelle. Il est possible de zoomer jusqu'à 8 fois. Résumé de l'exemple livré avec WINDEV : En utilisant la fonction dCopieImage() du WLangage et la propriété ..Opacité il est possible d'effectuer une capture du bureau Windows à l'emplacement d'une fenêtre sans que celle-ci n'apparaisse dans la copie d'écran. Cet exemple utilise cette astuce pour zoomer la partie de l'écran se trouvant en dessous de la loupe.
|
Documentation également disponible pour…
|
|
|