Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous.
Je voudrais savoir s'il est possible d'utiliser une fonction d'une DLL générée via Powerbuilder depuis une autre application (Powerbuilder ou autre)
Je m'explique.:
Dans une application 'A', j'ai créé une Fonction 'F' enregistrée dans la librairie L,
J'ai généré l'exécutable de cette application 'A', en cochant l'option 'Generate Machine Code'
En résultat, j'ai donc un .exe (A.Exe) et une dll (correspondant à la librarie L : L.dll)
Dans une autre application PB ('B'), j'ai déclacré une 'Local External Function' faisant appel à la fonction 'F' dans la DLL L.dll
FUNCTION int fonction_name (param) LIBRARY "L.dll" ALIAS FOR "F"
Dans un des événements d'une fenêtre de l'application 'B', j'appelle cette fonction .
Lors de l'exécution de cette application 'B', au moment où j'appelle cette fonction, j'ai un message d'erreur:
R00015 : Error calling function pla_rues at line ...etc..
Donc, il ne retrouve pas ma fonction dans la dll.
J'ai donc vérifié le contenu de ma DLL générée. En utilisant un éditeur de DLL (où l'on voit seulement les noms de fonction et non le contenu de chacune des fonctions) il s'avère que ma fonction ne porte pas vraiment le nom donné dans Powerbuilder. Au lieu de retrouver le nom 'F', j'ai ceci: '_getVtableInfo_F@12'.
Donc, avant le F, j'ai '_getVtableInfo_' qui s'est greffé et après, j'ai le '@12'.
donc, dans ma déclaration de fonction externe, au lieu de mettre ceci:
FUNCTION int fonction_name (param) LIBRARY "L.dll" ALIAS FOR "F"
je dois mettre
FUNCTION int fonction_name (param) LIBRARY "L.dll" ALIAS FOR "_getVtableInfo_F@12"
Et là, à l'exécution, au moment où l'appel à la fonction se fait, tout plante, je sors de l'appli violemment.
A priori, il ne rentre même pas dans la fonction
Je n'ai pourtant aucun soucis avec l'appel à des fonctions présentes dans des DLL de Windows.
Avez-vous déjà utilisées fait appels à des fonctions présentes dans des DLL générées via PB ?
Quelqu'un a-t-il une idée pour résoudre ce problème ?
Ou alors n'est il pas possible d'utiliser une fonction de DLL PB dans une autre appli ? Dans ce cas, quel est l'intérêt de générer des DLL au lieu de PBD ?
Merci d'avance
Kalini
Dernière modification par Kalini (06-09-2007 15:20:37)
Hors ligne
Bonjour, peut-être en faisant un AddToLibraryList( filelist ) avant l'appel de la fonction. (marche avec des PBD, à tester avec des DLL)
Hors ligne
Merci pour ta réponse eRaSorZ
Par contre, ça implique que la Dll soit inclue dans le Target Library de l'application appelant la fonction ?
Ce qui est étrange, c'est que dans l'exemple de l'aide Powerbuilder 10.5, ils mettent : AddToLibraryList(prod.pbd)
Moi, je suis obligé de mettre des "" : AddToLibraryList("L.dll") sinon, apparait une erreur comme quoi il ne connait pas la variable prod.pbd, que cette library DLL soit dans le target ou non, d'ailleurs.
Dernière modification par Kalini (07-09-2007 08:13:17)
Hors ligne
Selon la documentation de PB : PowerBuilder machine code DLLs cannot be called from other applications.
. C'est dans Application Techniques, chapitre Packaging an Application for Deployment.
Je n'ai pas d'expérience personnelle dans ce genre d'exercice, mais il me semble que la technique "AddToLibrary" soit la seule éventuellement utilisable. Bon courage
Hors ligne
1) On peut aussi faire un serveur COM/MTS/COM+, mais quand on lit : "The PowerBuilder automation server technology may be discontinued in a future release. " ça inquiète.
2) Faire des Web services et déployer sur EAS
3) Utiliser Corba
4) Reste une technique obsolète depuis 10 ans mais qui fonctionne toujours : DDE
Hors ligne
un truc de ce genre ?
http://64.18.163.122/rgagnon/pbdetails/pb-0123.html
Hors ligne