DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / Gestion des langages externes / Langage C
  • Présentation
  • Mise en place
  • 1. Inclusion des fichiers de l'interface C de WINDEV
  • 2. Inclusion des déclarations HFSQL
  • Déclaration et initialisation
  • 1. Déclaration du contexte HFSQL et des buffers de travail de chaque fichier:
  • Exécution de codes WINDEV depuis le langage externe
  • 1. Code d'initalisation du projet WINDEV
  • 2. Appel d'un code WLangage
  • 3. Récupération des événements déclenchés dans les fenêtres WINDEV
  • Mettre fin à l'application
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Présentation
Il s'agit ici d'appeler les éléments développés en WINDEV (projet, fenêtres, ... analyse) depuis le langage C. Ce système repose sur l'utilisation de fonctions déclarées dans les fichiers .h, .c et .cpp de WINDEV. Le code WLangage utilisé depuis le langage externe sera compilé dynamiquement et exécuté lors de son appel.
Ce mode est illustré dans :
  • le projet VC60.dsp (au format Visual C++ 6) fourni dans le sous-répertoire "External Languages\FR\C" du répertoire d'installation de WINDEV.
  • le projet BC5.0.IDE (au format Borland C 5) fourni dans le sous-répertoire "External Languages\FR\C" du répertoire d'installation de WINDEV.
Remarque : d'autres modes de programmation en langage externe sont disponibles. Pour plus de détails, consultez Les différents modes de programmation des langages externes
Mise en place

1. Inclusion des fichiers de l'interface C de WINDEV

Si vous utilisez une base de données dans votre application, la première étape consiste à générer votre analyse. Dans la description de cette analyse, précisez le langage de programmation utilisé ainsi que le répertoire qui contiendra les fichiers source.
Grâce à la génération, un squelette de programme est généré dans le langage externe choisi (par exemple le C). Cette opération créera de plus le fichier .h (voir plus bas) nécessaire à l'utilisation de vos fichiers de données.
Voici une liste des fichiers à inclure dans un projet C pour faire appel à l'interface C de WINDEV dans cette deuxième méthode :
Les deux lignes suivantes doivent être placées dans le code du fichier .c principal de votre projet C :
# include "WDExtern.h" // Langage et objets WINDEV
# include "HFContext.h" // SGBD HFSQL
Ces lignes permettent de récupérer les déclarations minimales nécessaires pour l'utilisation de l'interface externe. Il est à noter que les fichiers .h décrivant la structure des fichiers seront générés automatiquement par WINDEV lors de la génération de l'analyse.

2. Inclusion des déclarations HFSQL

Une inclusion (#include) doit être ajoutée pour chaque fichier de données déclaré dans l'analyse du projet WINDEV. Les déclarations des fichiers de données sont incluses dans le fichier d'extension .h (ce fichier remplace les .wdr créés avec la version précédente de WINDEV).
Par exemple dans le projet Vc60.dsp (fourni avec WINDEV dans le répertoire "LangagesExternes"), la ligne suivante est présente pour gérer les fichiers Ville et Departement :
#include "WD Langage externe.h"
Déclaration et initialisation

1. Déclaration du contexte HFSQL et des buffers de travail de chaque fichier:

Si l'application doit gérer des fichiers de données, il est nécessaire de déclarer un contexte de travail HFSQL, ainsi qu'un buffer par fichier de données.
Ces déclarations sont effectuées par les lignes suivantes dans le projet Vc60.dsp :
CHFContext gclHF; // Gestion du contexte HFSQL
StVILLE gstVille; // Buffer HF du fichier Ville
stDEPARTEMENT gstDepartement; // Buffer HF du fichier Depart
2. Initialisation des DLL de WINDEV
La première étape pour pouvoir utiliser les éléments développés dans WINDEV est de charger en mémoire les DLL de WINDEV, puis de les initialiser.
Ces opérations sont réalisées par l'appel de la fonction nWDInit, au début de votre procédure WinMain comme suit :
if (nWDInit(FALSE)!=WDERREUR_OK) ... // gestion du cas d'erreur
3. Initialisation de HFSQL
Dans le cas où votre application fait appel à une base de données, l'accès à HFSQL doit ensuite être préparé. Le test ci-dessous permet de vérifier si cette initialisation se déroule normalement :
IHFContext * pIHF;
if (!((nWDGetHFContext((void**)&pIHF)==WDERREUR_OK) &&
(gclHF.bInit(pIHF))))
{
// gestion du cas d'erreur
}
4. Chargement de la bibliothèque WINDEV (WDL)
La bibliothèque WINDEV d'extension .WDL contient tous les éléments du projet (fenêtres, états, classes, requêtes, analyse, ...). Il faut donc la charger en mémoire pour faire appel aux composants qu'elle contient.
Le chargement est réalisé par la fonction nWDOuvreWDL comme suit :
if (nWDOuvreWDL(szWDL)!=WDERREUR_OK)
{  
// Bibliothèque non trouvée
}
5. Ouverture de l'analyse du projet et association des buffers avec les fichiers de données
L'ouverture de l'analyse permet de faire appel aux fichiers de données. Une fois cette analyse ouverte avec la fonction HOuvreAnalyse, il ne reste plus qu'à associer les buffers de travail avec les fichiers décrits dans cette analyse :
// Ouverture de l'analyse (WDD contenu dans la WDL)
if (!gclHF.HOuvreAnalyse(szAnalyse,szMotDePasse))
{
// Erreur d'ouverture de l'analyse
}
// Association buffer <-> fichier
gclHF.bAssociate("ville",&gstVille,sizeof(gstVille));
gclHF.bAssociate("departement",&gstDepartement,sizeof(gstDepartement));
Exécution de codes WINDEV depuis le langage externe

1. Code d'initalisation du projet WINDEV

Ce code permet de démarrer le projet WINDEV en déclarant par exemple les variables globales. Son exécution depuis le langage externe est réalisée par la fonction nWDInitProjet. Par exemple :
if (nWDInitProjet("")==WDERREUR_INIT)
{
// Erreur lors de l'initialisation du projet
}

2. Appel d'un code WLangage

Toutes les fonctions WLangage peuvent être appelées depuis le langage externe. Leur comportement et les valeurs retournées par ces fonctions du WLangage sont exactement identiques qu'elles soient appelées :
  • depuis WINDEV ou
  • depuis l'interface langage externe
Pour connaître les paramètres et les valeur de retour d'une fonction du WLangage, il suffit donc de se reporter à l'aide en ligne ou la documentation papier habituelle relative au WLangage.
L'appel à une procédure du WLangage depuis l'interface externe se fait par la commande nWDExecute. Par exemple :
nWDExecute("OUVRE(\"menu.wdw\")"); // Ouverture de la fenêtre WinDev
Il est à noter que le paramètre attendu par la fonction nWDExecute étant une chaîne de caractères C contenant le code WLangage à exécuter, il est nécessaire de respecter la syntaxe des chaînes C (doubler les \, faire précéder les guillemets du caractère de contrôle \ ... etc). Ceci permet aussi de formater cette chaîne avec des caractères de contrôle tels que %s, %l ... à la manière de la fonction printf du C.
De plus, tout comme le WLangage codé dans WINDEV, cette chaîne n'est pas sensible à la casse (majuscules/minuscules). Donc par exemple la commande "Info" peut aussi être écrite "INFO".

3. Récupération des événements déclenchés dans les fenêtres WINDEV

La saisie dans les fenêtres WINDEV rend nécessaire la récupération des événements déclenchés dans ces fenêtres.
Afin de récupérer les événements (clic sur un menu, un bouton ...) de l'utilisateur, vous devez mettre en place un système basé sur une fonction 'callback' dans votre programme C. Cette fonction sera automatiquement appelée par votre fenêtre WINDEV à chaque action de l'utilisateur.
Pour connaître le type d'action de l'utilisateur, vous disposez d'une variable de type chaîne de caractères (en WLangage) nommée 'WDTouche'. Cette variable sera utilisée dans votre code WLangage pour signaler au programme C quel bouton a par exemple été actionné. Cette chaîne n'est pas limitée en taille et peut donc contenir des instructions détaillées que vous récupérerez dans votre code C.
Exemple : Code C
// Ouverture de la première fenêtre de l'application
// Définition de la procédure qui gère la fenêtre WinDev
nWDSetCallbackNext(CallBackMenu,0);
// Ouverture de la fenêtre WinDev
nWDExecute("OUVRE(\"menu.wdw\")");
[...]
Procédure C servant de callback pour la fenêtre :
void CallBackMenu(DWORD dwUserParam,LPCTSTR pszCodeAction)
{
// pszCodeAction contient la suite des lettres d'appel
// qui aboutissent au choix de menu sélectionné  
if( strcmp(pszCodeAction,"Quitter l'application")==0 ) nWDExecute("FERME()"); // Sortie
Code du menu "Fichier..Quitter" de la fenêtre WinDev "Menu" (WLangage) :
WDTouche="Quitter l'application"
La fonction nWDSetCallbackNext permet de fixer la procédure associée à la prochaine fenêtre qui va être ouverte. L'appel à nWDExecute pour réaliser l'ouverture de cette fenêtre termine le lien entre la fenêtre "Menu" et la callback "CallBackMenu".
Lorsque l'utilisateur cliquera sur le choix de menu "Fichier..Quitter", WDTouche sera renvoyée dans le paramètre "pszCodeAction" à la callback "CallBackMenu" qui pourra alors être testée dans le code C pour entreprendre la prochaine action.
Note : La variable WDTouche étant une chaîne de caractères, son contenu peut être une description détaillée de l'action à entreprendre. Par exemple "Fermer l'application".
Mettre fin à l'application
Pour terminer l'utilisation de l'interface externe, il suffit d'appeler la commande WDTerm qui n'a pas de paramètres. Par exemple :
WDTerm();
Version minimum requise
  • Version 9
Commentaires
Problème exceptions lors de l'appel d'une bibliothèque
Avec Windev >= 22, Windows > 10, VS >= 2019, 64 bit en C

Quand une exception est levée dans l'appel C d'une .wdl, nWDExecuteEx() retourne automatiquement false.

La VM ne reprend pas correctement le catch de l'exception !





Steph666
24 mai 2023

Dernière modification : 06/09/2023

Signaler une erreur ou faire une suggestion | Aide en ligne locale