Page 1 sur 1

CallFonctionFast et Memory

Publié : dim. 23/oct./2005 13:21
par lionel_om
Bonjour à tous.
J'ai qq questions à vous poser :

1) Y-t-il un moyen de contrôler si l'adresse de la fonction que l'on passe à CallFonctionFast() est correct, car quand ce n'ai pas le cas, le programme plante... :?

2) Y'a t'il une autre manière de connaitre la taille d'une zone mémoire que de passer par l'API (cf, je ne sais plus quel post récent : BufferSize_() ou qqchose du genre)

Merci d'avance...

Publié : dim. 23/oct./2005 13:27
par Chris
En principe, IsFunction() te retourne le pointeur vers la fonction de la dll, ou 0 si la fonction n'existe pas, et donc, il ne peut, normalement, pas y avoir de plantage.

Je n'ai, pour ma part, jamais eu de problème avec ces fonctions.

Pour la question 2, je ne sais pas

Publié : dim. 23/oct./2005 13:29
par Dr. Dri
LocalSize peut être

Dri

Publié : dim. 23/oct./2005 13:39
par Chris
Dr. Dri a écrit :LocalSize peut être

Dri
C'est ce que j'avais donné sur un autre post, mais c'est de l'Api, et il en veut pas :lol:

Publié : dim. 23/oct./2005 14:47
par Dr. Dri
ah oué il en veut pas :lol:
j'ai cherché dans le library descriptor mais la lib memory n'est pas décrite
comme freememory(-1) libère toute la mémoire allouée il doit y avoir moyen d'accéder à la liste des zones allouées mais comme on a rien dans le descriptor faut demander à Fred...

Dri

Publié : lun. 24/oct./2005 9:23
par lionel_om
@Chris
IsFunction() ne marche qu'avec des fonctions d'une librairie (DLL). Mais ca ne marche pas avec une function interne ?!

@Dri
ah oué il en veut pas :lol:
:lol:


Merci pour vos réponses.

Publié : lun. 24/oct./2005 9:56
par Chris
lionel_om a écrit :@Chris
IsFunction() ne marche qu'avec des fonctions d'une librairie (DLL). Mais ca ne marche pas avec une function interne ?!
Parce que tu l'utilises avec quoi d'autre que les fonctions des dll, le CallFunctionFast() ? 8O
Parce que, selon l'aide, CallFunctionFast() ne fonctionne qu'avec ça!
Appelle une fonction en librairie en utilisant son pointeur obtenu par IsFunction() ou par LibraryFunctionAddress().
Ou alors, il y a quelque chose que je n'ai pas pigé, mais c'est interessant si ça peut être utilisé d'une autre manière que celle décrite dans l'aide.

Qu'est-ce que tu appelles, les "fonctions internes".
Pour moi, ce sont les fonctions qui sont codées dans le programme, et celle des librairies de PureBasic, (Lib utilisateur, et natives).
Je me trompes?

Publié : lun. 24/oct./2005 11:51
par lionel_om

Code : Tout sélectionner

Procedure truc()
  Procedurereturn 1
EndProcedure

Debug CallFunctionFast(@truc())
; Doit débugger '1' (ms j'ai pas pu vérifier)
Voilà, je l'utilise comme ça CallFunctionFast et ça marche très bien. :wink:

Par contre si je lui passe une valeur autre que l'adresse d'une fonction, ça plante... :?
Ex :

Code : Tout sélectionner

CallFunctionFast(666)
-> Plantage sévère de l'application.

Publié : lun. 24/oct./2005 12:03
par Chris
lionel_om a écrit :

Code : Tout sélectionner

Procedure truc()
  Procedurereturn 1
EndProcedure

Debug CallFunctionFast(@truc())
; Doit débugger '1' (ms j'ai pas pu vérifier)
Voilà, je l'utilise comme ça CallFunctionFast et ça marche très bien. :wink:
J'ai encore appris quelque chose. J'avais j'amais essayé ça :lol:

Par contre, quel est l'interêt par rapport à la manière standard d'appeler la procédure?

CallFunctionFast() demande une adresse pour lancer la fonction, c'est normal que ça plante si tu lui met 666. Il va cherche la fonction à cette adresse, et il ne la trouve pas. En plus, tu dois certainement appeler dans un espace mémoire reservé, et ça, windows n'apprécie pas plus que ça, et il te le dit!

Publié : mar. 25/oct./2005 9:13
par lionel_om
C'est pour une librairie :wink:
Dans ma LibVector (on peut faire des tris, recherches, etc) j'ai besoin d'une procédure de comparaison de :
* entiers (fait)
* strings (fait)
* structure (c'est l'utlisateur qui passe l'adresse de la procédure qui va faire les comparaisons en relation avec sa structure).

Sinon en effet, je crois qu'il n'y a pas d'intérêt :lol: