Précédent | Sommaire | Suivant

D.3 Appel d'une DLL externe en utilisant le plug-in System.dll

Notez que les fonctions Call, Get et Debug ne peuvent pas être compilées avec GCC, donc téléchargez la version Windows de NSIS et prenez le plugin System.dll ou écrivez votre propre plugin qui appelle les fonctions dont vous avez besoin.

Certains processus d'installation sont requis pour appeler des fonctions contenues dans les DLLs tiers. Un exemple évident est lors de l'installation d'un conduit Palm(TM).

Et pendant ce temps, System.dll
Le plug-in System.dll (par Brainsucker) permet l'appel de DLLs externes en fournissant la fonction 'Call'. Il existe bien d'autres fonctions fournies par System.dll, mais elles ne seront pas couvertes ici. Pour plus d'informations sur les autres fonctions, verrouillez votre porte, décrochez le téléphone, et approchez lentement (en faisant des détours pour être certain de ne pas être suivi) du répertoire Contrib/System, et lisez-y les documentations.

Types de données
System.dll reconnait les types de données suivant :

  • v - void (généralement pour les valeurs de retour)
  • i - int (cela inclus char, byte, short, handles, pointeurs et ainsi de suite)
  • l - entier long & large (connus sous le nom de int64)
  • t - texte, string (LPCSTR, pointeur sur le premier caractère)
  • b - boolean ('true':'false') - ce type est sans utilité puisque l'on peut utiliser des entiers normaux ('0':'1')
  • k - interaction. Voir la section Callback dans system.txt.
  • * - spécificateur de pointeur -> le proc nécessite un pointeur du type, affecte le caractère suivant (paramètre) [ex : '*i' - pointeur sur un entier]

Correspondances entre les variables System.dll et les variables de script NSIS
Il n'y a aucun intérêt à être capable d'appeler des fonctions externes s'il n'est pas possible de récupérer des données. System.dll fait correspondre les variables des fonctions en variables NSIS de cette manière:

NSIS $0..$9 devient System.dll r0..r9 NSIS $R0..$R9 devient System.dll r10..r19

Chaque paramètre est spécifié par un type, une entré et une sortie. Pour sauter l'entrée ou la sortie, utilisez un point. Par exemple :

String (pointeur sur un tableau de caractères), l'entrée est 'Joyeuses Pâques' :

t 'Joyeuses Pâques'

String (pointeur sur un tableau de caractères), l'entrée est prise depuis $5 et les modifications du tableau faites par l'appel sont sauvées dans $R8 :

t r5R8

Pointeur sur un entier, la valeur est prise depuis $1 et mise dans $2 :

*i r1r2

Pointeur sur un entier 64 bits, la sortie est mise dans la pile, aucune entrée :

*l .s

Utilisation de System.dll::Call Pour appeler une fonction dans une DLL tiers, la fonction Call est utilisée comme cela :

System::Call 'VotreDLL::SuperFonction(i, *i, t) i(r0, .r1, r2) .r3'

la section '(r0, .r1, r2) .r3' à la fin correspond aux paramètres passés entre votre DLL et votre script NSIS. Comme vous pouvez le voir dans cette liste de paramètres, types et type entrées/sorties peuvent être séparés. Chaque bloc de "(liste de paramètres) valeur de retour" écrase et/ou s'ajoute au précédent. Dans ce cas, le premier bloc spécifie le type et le second, les entrées/sorties.

Avant de coder comme un fou votre script NSIS
Avant de vous attaquer au code NSIS, vous devez connaître le prototype complet de la fonction que vous allez appeler. Pour les besoins de cet exemple, nous utiliserons la fonction 'CmGetHotSyncExecPath' pour 'CondMgr.dll' de Palm. Cette fonction est utilisée pour retourner le répertoire complet de 'HotSync.exe'.

Définition de la fonction

int CmGetHotSyncExecPath(TCHAR *pPath, int *piSize);

  • pPath est un pointeur sur un tampon de caractères. Après le retour, il s'agit du chemin et du nom de fichier du gestionnaire HotSync installé.
  • piSize est un pointeur spécifiant la taille (en TCHAR), du tampon référencé par le paramètre pPath.

valeur de retour :

  • 0 : Aucune erreur
  • -1 : Une erreur non spécifique s'est produite
  • ERR_REGISTRY_ACCESS (-1006) : Impossible d'accéder aux entrées de configuration de Palm
  • ERR_BUFFER_TOO_SMALL (-1010) : Le tampon est trop petit pour contenir l'information demandée
  • ERR_INVALID_POINTER (-1013) : Le pointeur spécifié n'est pas un pointeur valide

Ainsi, si le tampon est trop petit, la valeur dans *int est la taille (en TCHAR) que le tampon devrait être.

Cette définition de fonction correspond pour System.dll à la définition suivante :

CmGetHotSyncExecPath(t, *i) i

ex. Elle prend un variable texte, un pointeur sur un entier, et renvoi un entier.

Utilisation d'une fonction DLL externe
Maintenant que nous avons vu comment fonctionnait la fonction, et comment elle était convertie en format System.dll, nous pouvons utiliser la fonction dans un script NSIS.

Tout d'abord, il est recommandé de paramétrer 'PluginUnload' à off avant de faire plusieurs appels avec System.dll. D'après Brainsucker (et d'autres), cela accélérera l'exécution du package d'installation.

Ensuite, vous devez modifier le répertoire de destination vers celui contenant la DLL que vous voulez utiliser. Cela peut tout de même fonctionner si la DLL est dans le répertoire système, mais cela n'a pas été testé.

Le fragment de code suivant installera 'condmgr.dll' dans un répertoire temporaire, exécutera la fonction CmGetHotSyncExecPath, affichera les données retournées et déchargera finalement le plug-in System.dll. Enregistrez ce script

; **** snip ****
SetPluginUnload  alwaysoff

Function loadDll

  SetOutPath $TEMP\eInspect             ; créé un répertoire temporaire
  File bin\CondMgr.dll                  ; copie de la dll
  StrCpy $1 ${NSIS_MAX_STRLEN}          ; définition mémoire de $0
  System::Call 'CondMgr::CmGetHotSyncExecPath(t, *i) i(.r0, r1r1).r2'
  DetailPrint 'Rep : "$0"'
  DetailPrint "Taille rep : $1"
  DetailPrint "Valeur de retour : $2"

; le dernier appel de plug-in de doit pas spécifier /NOUNLOAD pour que NSIS soit capable de supprimer
; la DLL temporaire

  SetPluginUnload manual
; ne rien faire (mais laisser l'installation décharger System.dll)
  System::Free 0
FunctionEnd
; **** snip ****

cette fonction produit la sortie suivante dans la page 'Détails' :

destination : c:\windows\TEMP\eInspect
Extraction : CondMgr.dll
Rep : "C:\Dave\palm\Hotsync.exe"
Taille rep : 24
Valeur de retour : 0

Ecrit par djc

Accords & Remerciements
Une tonne de mercis à kichik et Sunjammer pour avoir passé beaucoup de temps à résoudre ce problème. Merci aussi à brainsucker pour créer le plug-in System.dll, et c'est normal. Bonne chance !

Précédent | Sommaire | Suivant


A propos | Contacts | Publicité | Info légales | © Todae 2006-2008

Sites partenaires : discount | avis rémunérés| sorties DVD | Winamp