Création d'une fonction personnalisée
Pour la création de vos propres fonctions, un outil de développement C ou C++ est requis, ou l'interface JNI si vous travaillez dans un environnement Java.
Procédure
- A partir d'une règle composant dans Type Designer ou d'une règle de mappe dans Map Designer, cliquez avec le bouton droit de la souris et sélectionnez l'option Insérer une fonction.
(Dans Map Designer, si vous n'êtes pas dans une règle de mappe, vous pouvez également créer une nouvelle fonction en sélectionnant .)
- Dans la fenêtre Insérer une fonction, sélectionnez Design.
La fenêtre Personnaliser les modules de fonctions s'affiche.
- Dans la zone Chemin, entrez le chemin dans lequel créer la bibliothèque externe. Il doit toujours être dans le répertoire install_dir/function_libs.
- Dans la zone Nom, entrez un nom pour la bibliothèque.
- Cliquez sur Ajouter pour ajouter une fonction à la bibliothèque. La fenêtre Définition d'une fonction s'affiche.
- Dans la zone Nom, entrez un nom pour la fonction.
- Pour Type de retour, sélectionnez le type de retour de la fonction dans la liste déroulante. Vous pouvez sélectionner jusqu'à quatre paramètres de fonction dans la liste déroulante correspondante. Les choix sont les suivants : booléen, date, nombre, texte, heure et flot d'octets.
- Dans l'espace fourni, entrez une description pour votre fonction.
Ces informations sont affichées dans la fenêtre Insérer une fonction des deux concepteurs.
- Cliquez sur OK pour valider les paramètres sélectionnés et fermez la fenêtre Définition d'une fonction.
- Cliquez sur Générer. Le concepteur crée une collecte des fichiers spécifiques au système d'exploitation et des fichiers de définition qui fournissent la structure de la fonction que vous créez.
-
Accédez au répertoire install_dir/function_libs pour visualiser les résultats.
Suite au processus de génération, des fichiers d'infrastructure sont créés pour chaque système d'exploitation pris en charge par Lien HCL. Les fichiers spécifiques au système d'exploitation et les fichiers de définition se trouvent dans le répertoire install_dir/function_libs/your_new_lib.
- Vous devez maintenant modifier la structure créée par le concepteur. Les fonctions suivantes et les informations de paramètre que vous avez sélectionnées ont été exportées dans le fichier .c :
- GetFunctionCount
- GetFunctionName
- GetInputParameter
- GetReturnType
- GetParameterCount
- GetFunctionDesc
Pour terminer la nouvelle fonction, ouvrez le fichier .c et ajoutez votre code de programmation pour la ou les fonctions applicables fournies.
Utilisez le fichier .c pour créer votre bibliothèque de liaison dynamique (DLL), puis placez la DLL dans le répertoire install_dir/function_libs/your_new_lib. (Toutes les bibliothèques et fonctions conçues et personnalisées doivent être placées dans le répertoire install_dir/function_libs.)
Le nouveau nom de bibliothèque est répertorié sous Catégorie dans la fenêtre Insérer une fonction, et la nouvelle fonction créée est placée dans la liste des fonctions et reste disponible pour une utilisation ultérieure à partir des applications Type Designer et Map Designer.
Exemple
void ConvertToBytes(double returnValue, LPEXITPARAM lpep)
{
double value = 0.0;
int decimal = 2, sign = 0, j = 0, k = 0;
char byString[100];
char* lpbyData = _fcvt(returnValue, 7, &decimal, &sign );
memset(byString, 0, sizeof(byString));
if (sign)
byString[j++] = '-';
if (decimal <= 0)
{
byString[j++] = '0';
byString[j++] = '.';
while (decimal != 0)
{
byString[j++] = '0'; decimal++;
}
}
else if (decimal > 0)
{
while (decimal != 0)
{
byString[j++] = lpbyData[k++]; decimal--;
}
byString[j++] = '.';
}
while (lpbyData[k]) byString[j++] = lpbyData[k++];
byString[j] = '\0';
if (NULL == (lpep->lpDataFromApp = GlobalAllocPtr
(GHND, j + 1)))
{
lpep->nReturn = -1;
lstrcpy(lpep->szErrMsg, "Memory allocation failed in Alternate");
return;
}
memcpy(lpep->lpDataFromApp, byString, j);
lpep->dwFromLen = j;
lpep->lpDataFromApp[j++] = '\0';
}
void CALLBACK EXPORT SIN(LPEXITPARAM lpep)
{
double value = 0.0;
double returnValue = 0.0;
LPEXITPARAMEXTENDED lpExtended = NULL;
if (lpep->dwSize != sizeof(EXITPARAM))
{
return;
}
lpExtended = (LPEXITPARAMEXTENDED)lpep->lpv;
value = atof(lpExtended->lpFirstInputParameter);
returnValue = sin(value);
ConvertToBytes(returnValue, lpep);
lpep->wCleanupAction = GetReturnType("SIN");
lstrcpy(lpep->szErrMsg, "SIN function was successful");
return;
}