![]() |
|
Précédent | Sommaire | Suivant D.3 Appel d'une DLL externe en utilisant le plug-in System.dllNotez 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 Types de données
Correspondances entre les variables System.dll et les variables de script NSIS 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 Définition de la fonction int CmGetHotSyncExecPath(TCHAR *pPath, int *piSize); où
valeur de retour :
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 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 Ecrit par djc Accords & Remerciements Précédent | Sommaire | Suivant |
||
|