Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1 2
Connaissez-vous FastFuncs?
FastFuncs est un projet de Jeremy Lakeman (un hacker PB confirmé semble-t-il) permettant de compiler une dll (qui n'est pas une extension PBNI) utilisable depuis PB (via quelques fonctions globales permettant le wrapping des fonctions de la dll) et permettant quelques innovations comme :
- fonctions rapides de manipulation de blob (blob_extract, blob_mid, blob_import, et blob_alloc permettant d'allouer un blob sans mettre quelques chose dedans, utile pour appeler l'API sans perdre du temps à remplir des espaces)
- fonctions rapide de manipulation de bits (and, or)
- fonctions rapides de concaténation, remplacement, découpage de string et pos() rapide
- tri de tableaux
- interrogation de la pile d'appel je ne résiste pas à vous montrer une image de notre intégration de fastfuncs pour la gestion des erreurs : ce qui est en jaune on arrivait à l'avoir précédemment avec l'objet Error, mais stack_trace() permet d'obtenir ce qui est en rouge, soit la pile d'appel complète (les méthodes avec un '+' sont des évènements) :
Vous pourrez remarquer, dans le code des external functions déclarées dans les fonctions globales d'interfaçage, l'usage du mot-clé interne "system" :
global function blob blob_alloc (unsignedlong length) system library "fastfuncs115.dll" alias for 'Blob_Alloc'
En fait ces fonctions de dll sont appelées directement par PB sans passer par la glu PBNI et elles reçoivent un accès direct à la machine virtuelle PB, permettant un tas de chose intéressantes. D'ailleurs la lecture du code des fastfuncs est également fort intéressant
Pour vous situer le personnage, en dehors de ce projet public il a bien exploré les entrailles de PB puisqu'il s'est fait un désassembleur PB (qu'il garde jalousement pour lui) et il travaille sur un "transcodeur" basé sur llvm permettant de recoder des objets en bytecode PB vers du code natif. Une sorte de JIT pour PB. Encore un grand malade
Le projet permet de fabriquer la dll kivabien pour PB 10, 10.5, 11, 11.5, 12, 12.5.
Dernière modification par seki (06-03-2013 16:59:35)
Hors ligne
Salut Seki,
question de gros noob :
Comment on fait si on veut utiliser ces FastFuncs ?
si je vais télécharger le Zip sur le site je me retrouve avec un répertoire (par version de PB) avec des exports d'objets PB (genre replace_all.srf) ça je comprends mais ces exports ne contiennent que la définition des fonctions externes à utiliser et renvoient vers "fastfuncs100.dll" que je ne trouve nulle part dans le Zip
suis-je censé compiler la dll moi-même ? Si oui comment ?
Qu'est ce qu'on est censé faire du contenu du répertoire libs et de tous les autres fichiers à la racine du zip ( ".gitignore", "fastfuncs.vcproj" etc ) ?
Hors ligne
Alors si tu prends le .zip sur github, tu te retrouves avec les sources MS Visual C du projet pour faire la dll toi-même.
- fastfuncs.vcproj c'est le projet C et fastfuncs.sln la "solution" Visual studio (qui veut mini du MSVC9, soit Visual Studio 2008) mais en bricolant le vcproj j'ai pu refaire le projet pour VS2005
- .gitignore c'est un fichier permettant de lister ce qui ne doit pas être traité par le suivi de version git
- le répertoire libs permet de fabriquer des bibiothèques d'import permettant au code du projet de pouvoir appeler des fonctions dans les dll pbvmxxx et pvshrxxx correspondant à ta version PB, ça utilise l'outil lib qui fait partie de MSVC
- les différents répertoires fastfuncs100..125 contiennent les sources des différentes fonctions globales permettant d'appeler les fast funcs
- le répertoire build contient la dll résultat
Si tu es en 11.5 je peux mettre à disposition la dll et la pbl permettant de l'utiliser. Si j'ai le temps et si vous êtes sage, j'essaie de faire les autres aussi. Mais je n'ai pas 12 ou 12.5 pour le moment.
Dernière modification par seki (07-03-2013 09:25:27)
Hors ligne
Ah ok, dommage qu'il donne pas les dll directement.
merci pour la proposition mais je ne travaille pas en PB11.5 personnellement.
Hors ligne
rincevent a écrit:
Ah ok, dommage qu'il donne pas les dll directement.
merci pour la proposition mais je ne travaille pas en PB11.5 personnellement.
T'es avec quelle version ?
Hors ligne
10.2.0 Build 8100
Hors ligne
Mmh. J'ai 10.2.1.9948. Tu peux peut-être tenter ta chance...
Hors ligne
Hors ligne
Bon, les libs pré-compilées pour 10.2, 10.5 et 11.5 sont chez moi .
Un exemple d'utilisation : la fonction GetCallStack() (j'itère sur un élément de moins de la callstack pour ne pas voir la fonction elle-même):
global type getcallstack from function_object end type forward prototypes global function string getcallstack () end prototypes global function string getcallstack (); string frames[], msg int i stack_trace(ref frames[]) msg = "Stack trace:~r~n" for i = upperbound(frames[]) - 1 to 1 step -1 msg += frames[i] + '~r~n' next return msg end function
Une remarque : ne pas essayer d'ouvrir les fonctions globales de la pbl qui comportent des arguments variables (...) : avec PB11.5 on voit un argument avec un nom en chinois, mais en PB10.2 ça plante lamentablement, juste après un message indiquant "functions with a var list argument cannot be overridden"
Dernière modification par seki (07-03-2013 10:48:30)
Hors ligne
Seki si tu n'existais pas faudrait t'inventer
merci, je testerai ça plus tard et je viendrai dire ce que ça a donné.
Hors ligne
J'ai fait un petit test chez nous de stack_trace sous PB12.1 build 6875 et c'est bien sympa.
Je vais l'utiliser dans une fenêtre d'erreur de notre progiciel proche de celle du premier screen de Seki.
Je vous ferais un retour une fois fait.
Si quelqu'un en a besoin je peux fournir la dll pour pb12 (Éventuellement si Seki veut bien on pourrait le rajouter à son pack).
Je n'ai pas fait de pbl avec les appels external functions par contre, je peux également le faire si ça intéresse quelqu'un.
Hors ligne
Pas encore eu le temps de tester mais je perds pas espoir
Hors ligne
Van a écrit:
J'ai fait un petit test chez nous de stack_trace sous PB12.1 build 6875 et c'est bien sympa.
Je vais l'utiliser dans une fenêtre d'erreur de notre progiciel proche de celle du premier screen de Seki.
Je vous ferais un retour une fois fait.
Si quelqu'un en a besoin je peux fournir la dll pour pb12 (Éventuellement si Seki veut bien on pourrait le rajouter à son pack).
Je n'ai pas fait de pbl avec les appels external functions par contre, je peux également le faire si ça intéresse quelqu'un.
Je serai intéressé par les versions pour PB12 voir PB12.5 !
merci d'avance
Hors ligne
J'ai pas de PB12.5 mais voilà la dll pour PB12 http://dl.free.fr/rU9zRcXXD
Hors ligne
Van a écrit:
J'ai pas de PB12.5 mais voilà la dll pour PB12
Merci, je vais tâcher d'ajouter dans le .zip chez moi.
Je pensais aussi qu'on pourrait le mettre dans les téléchargements du forum (j'ai la possibilité de la faire) ?
Hors ligne
seki a écrit:
Je pensais aussi qu'on pourrait le mettre dans les téléchargements du forum (j'ai la possibilité de la faire) ?
Il faut être admin.
Tu peux me l'envoyer par mail.
Hors ligne
erasorz a écrit:
Il faut être admin.
J'ai l'impression que je suis modo++, (j'ai accès à la partie partage des fichiers, sans pour autant avoir accès à d'autres parties comme la gestion des users)
Hors ligne
my bad... je pensais que tu avais essayé sans succès
ça fait tellement longtemps que j'avais paramétré ça :
Pour info les permissions du forum et du portail sont gérées séparément.
Bah du coup tu pourras l'uploader et mettre le lien dans le premier message du fil
Hors ligne
La version pb12.5 si il y a des intéressés
http://dl.free.fr/pR4vYzhgr
Par contre d'après la documentation:
In PowerBuilder 8 and later, if an error occurs that is not caught by the exception handling mechanism or by an Error or ExternalException event, the script terminates and the call stack is unwound. If the error occurs as the result of a Triggerevent call in a script, the calling script terminates and the call stack is unwound. In most cases, the SystemError event is not triggered until the call stack becomes empty. If an event of a response window caused the error, the SystemError event is triggered as soon as the response window event completes.
Du coup si j'appelle le stack_trace depuis l'event systemerror de l'application mon call stack est vide une astuce quelque part ?
merci
Hors ligne
_francois_ a écrit:
La version pb12.5 si il y a des intéressés
Merci !
_francois_ a écrit:
Du coup si j'appelle le stack_trace depuis l'event systemerror de l'application mon call stack est vide une astuce quelque part ?
Dans mon exemple, j'affiche un dialogue d'erreur mais c'est au cours d'une exécution normale du code où le développeur demande à un objet de faire un truc impossible. D'où le message pour indiquer au dev qu'il existe parfois un cas foireux.
Dans le cas d'un plantage de l'application, il semble en effet que ce soit trop tard et que la call stack ait été vidée par PB avant de donner la main dans systemerror (mais pourquoi ??)
Hors ligne
En encadrant sont code par try/catch tu récupéré ton erreur comme il faut.
try //code //...... //...... dw_test.getitemstring(0,'champ_inconnu') //line xx //code //...... //...... catch (runtimeerror e) messagebox("text", e.text) // retourne le text erreur "Invalid DataWindow row/colomwn specified line xx function uf_test of object uo_object." messagebox('stack', f_getcallstacktrace(50, is_test)) //la pile est identique à ce qu'elle était avant l'erreur end try
Hors ligne
Je crois que le problème de _francois_ c'est pour faire un attrapeur d'erreur général dans l'évènement systemError() : quand on arrive dans système error, la pile est vide.
Effectivement si ponctuellement on veut pouvoir attraper une exception en sachant où elle risque de se produire, on peut utiliser try..catch. (Attention tout de même si on est dans une boucle rapide cela peut ralentir beaucoup l'exécution).
Hors ligne
oui je connais le try catch que j'utilise d'ailleurs
seki a bien compris ma "problématique" qui était de faire un attrapeur général pour m'aider dans une application qui a été codée de manière très spéciale, enfin ça ne m'empêche pas dormir la nuit je voulais juste savoir si il y avat une "astuce" que j'aurais loupé
mais merci quand même
Hors ligne
Je ne connais pas (c'est un tord, je l'avoue) l'impact en terme de temps d'exécution d'un try/catch.
Mais supposons que tu ai une fonction avec un try en tout début de code, l'ensemble de ta fonctionalité contenant ou pas de boucles rapides et en fin de code le catch.
Depuis le catch tu appel un fenêtre tel que tu l'as montré en début du topic. Après ça tu peux quitter ta fenêtre/traitement/etc ou simplement fermé l'application.
Ca serait envisageable ou le temps d'excécution en prendrait pour cher?
Hors ligne
Salut , je reviens un peu sur ce sujet car j'ai un peu de temps libre mais malheureusement la plupart des liens de téléchargement ne sont plus valides et je ne trouve pas dans la section téléchargement du site. (ni sur le site de Seki)
c'est moi qui regarde mal ou bien ? ( je cherche la dll pour la version 12.0 )
en attendant je vais tester un peu avec les versions pour PB 10.0 parceque bon, une fois qu'on est en Unicode un pos() devrait pas changer fondamentalement entre 10 et 12 si ?
Du coup je me dis si c'est juste à quoi ça sers de faire 50 versions des dll alors qu'une version ANSI et une version Unicode suffiraient ? Bon j'vais faire mes tests avant d'aller plus loin mais il me semble que niveau facilité d'utilisation ça aurait pu être bcp plus simple.
Edit : Bon ben ça marche pas, j'essaye avec PB 12.0 et fastfuncs115.dll et j'obtiens une erreur "error opening dll library fastfuncs115.dll..."
Edit 2 : pffff, je chipote un peu en PB 10 aussi, j'inclus fastfuncs100.pbl à mon projet, je regarde dedans, des fonctions globales, j'essaye d'en ouvrir une, vide..., j'essaye ça plante aussi bien sûr.
Edit 3 : ha par contre c'est dispo ici maintenant : http://geni.embeddingperl.com/index.php … cs-patched vais retester avec fastfuncs120.dll mais je le sens mal... (c'est quoi dans ce genre d'outils ces pbl's impossibles à ouvrir ou ces pbd qu'on peut pas ouvrir ni modifier non plus ? pas pratique pour inclure dans un projet tout ça. )
Edit 4 : ha ben finalement si il doit y avoir des différrences entre les différentes versions des dll parceque avec fastfuncs120.dll ça fonctionne
Hors ligne
Pages: 1 2