http://www.purebasic.fr/english/viewtop ... =4&t=39433
...la version finale pour ce soir ?

Code : Tout sélectionner
CallFunction(0, "Function", "Kcc")
Code : Tout sélectionner
CallFunction(0, "Function", @"Kcc")
Code : Tout sélectionner
CallFunction(0, "Function", @a$)
Bon nous allons espérer pour cette semaine ^^beauregard a écrit :http://www.purebasic.fr/english/viewtop ... =4&t=39432
http://www.purebasic.fr/english/viewtop ... =4&t=39433
...la version finale pour ce soir ?
Merci mon bon DENIS de ton soutienDenis a écrit :Salut KCC,
moi aussi ça m'a pris du temps sur mon projet de changer les callfunctionFast et je me suis dit, si ça change encore, j'ai pas fini.
J'ai tout passé en prototype, le compilateur vérifie même le type des paramètres, peut même forcer des valeurs en unicode/ASCII/UTF8 (pseudotypes) alors qu'avec le callfunction, aucun contrôle.
C'est pas très dur, juste une gymnastique.
A+
DJES je t'adore tu le saisdjes a écrit :Je ne m'en sers pas souvent, mais franchement, je trouve les prototypes bien plus simples!
Code : Tout sélectionner
CallFunction(Library, "Function")
Code : Tout sélectionner
; If CallFunctionFast(*lpEnumFunc, hModule, i, lParam) = #Stop_Enumeration
Code : Tout sélectionner
If Callback(*hModule, i, lParam) = #Stop_Enumeration
Code : Tout sélectionner
Protected Callback.PIM_EnumResourceNames_ICO_File = *lpEnumFunc
Code : Tout sélectionner
Prototype.i PIM_EnumResourceNames_ICO_File(*hModule, i, lParam)
Code : Tout sélectionner
ProcedureDLL.i PIM_EnumResourceNames_ICO_File(*hModule.PIM_LoadFileToMemory_EX, *lpEnumFunc, lParam)
;///////////////////////////////////////////////////////////////////////////////////////////////////
;//
;// FONCTION: PIM_EnumResourceNames_ICO_File()
;//
;// BUT: Permet d'énumérer les icônes d'un fichier ico
;// Le paramètre *lpEnumFunc est l'adresse d'une procedure qui sera appelée pour faire les
;// opérations nécessaires sur les valeurs énumérées.
;//
;// PARAMS: *hModule - pointeur sur la variable PIM_LoadFileToMemory_EX utilisée pour mémoriser les données
;// du fichier ICO
;// *lpEnumFunc - adresse d'une procedure qui sera appelée pour faire les opérations
;// nécessaires sur les valeurs énumérées.
;// lParam - Valeur passée par la fonction appelante et correspond ici à l'adresse de
;// d'une variable de type InfosResourceEx qui stocke les infos sur les icônes et groupes
;//
;// RETOURNE: #Continue_Enumeration (=#True) si l'énumération continue (tant qu'il y a des icônes)
;// #Stop_Enumeration (=#False) si l'énumération doit stopper en cas d'erreur
;//
;//
;// La callback est de la forme :
;//
;// Procedure EnumResNameProc(hModule, ItemPosition, lParam)
;// xxx
;// EndProcedure
;//
;// PARAMS: *hModule - pointeur sur la variable PIM_LoadFileToMemory_EX utilisée pour mémoriser les données
;// du fichier ICO
;// ItemPosition - position de l'icône dans le fichier car ies icônes n'ont pas d'identifiants
;// lParam - Valeur passée par la fonction appelante et correspond ici à l'adresse de
;// d'une variable de type InfosResourceEx qui stocke les infos sur les icônes et groupes
;//
;//
;///////////////////////////////////////////////////////////////////////////////////////////////////
;// mémorise l'adresse du contenu de la ressource, à partir du début du fichier modifié dans chaque boucle
Protected *Memory_Add_temp.IconDir_0
;// pointeur sur les éléments mémorisants les données d'énumération
Protected *ResourceInfos.InfosResourceEx
;// compteur de boucle
Protected i
;// variable prototype de la callback d'énumeration
Protected Callback.PIM_EnumResourceNames_ICO_File = *lpEnumFunc
;// si un des pointeurs est nul, on stoppe l'énumération
If (*hModule = #Null) Or (*hModule\Pt_Memory_File_Address = #Null) Or (*lpEnumFunc = #Null) Or (lParam = #Null)
PIM_SetError_Code(#Error_Code_Pointeur_Null)
ProcedureReturn #Stop_Enumeration
EndIf
;// mémorise la valeur du pointeur, ce pointeur va évoluer
*Memory_Add_temp = *hModule\Pt_Memory_File_Address
;// si pas d'icônes à traiter, on stoppe l'énumération
If *hModule\Icon_Number <= 0
PIM_SetError_Code(#Error_Code_ICON_Number)
ProcedureReturn #Stop_Enumeration
EndIf
;// ici on va appeler la procedure pointée par *lpEnumFunc pour chaque icône
;// on teste que les structures se situent bien dans la zone mémoire, y compris le word qui suit
If (@*Memory_Add_temp\idEntries[*hModule\Icon_Number] + SizeOf(IconDirEntry) -1 > *hModule\LastMemoryAdress)
PIM_SetError_Code(#Error_Code_Reading_Writing_Over_LastMemoryFileAdress)
ProcedureReturn #Stop_Enumeration
EndIf
For i = 1 To *hModule\Icon_Number
;// on appele la callback en passant la position (i) de l'icône
;// le premier icône a l'indice 1
If Callback(*hModule, i, lParam) = #Stop_Enumeration
; If CallFunctionFast(*lpEnumFunc, hModule, i, lParam) = #Stop_Enumeration
;// l'utilisateur a arrêté l'énumération
;// si il y a un code d'erreur, on retourne #Return_Error, sinon on retourne #Return_No_Error
If PIM_GetError_Code()
ProcedureReturn #Return_Error
Else
ProcedureReturn #Return_No_Error
EndIf
EndIf
Next
;// retourne #Continue_Enumeration pour continuer l'énumération
ProcedureReturn #Continue_Enumeration
EndProcedure