Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
Tout d'abord, je vous souhaite une très bonne année 2013... Oui, même à toi, là devant ton écran
Sinon... venons en au fait...
J'essaie d'envoyer des données de PB vers la messagerie de ma boite (Groupwise pour le moment) et plus précisément... j'essaie de créer des rendez-vous à partir d'un programme PB !
Et là, c'est le drame... J'ai beau chercher et retourner (à tous les sens du terme) la doc PB... je ne trouve rien de bien gras à me mettre dans le code C'est triste non ?
Bref j'étais parti sur la possibilité d'envoyer un mail en disant "attention, il s'agit en fait d'un rdv" mais je ne trouve pas ! Je suis désespérément désespéré !
Si z'avez une idée, une piécette, un morceau de pain à me filer... n'hésitez pas
Dernière modification par jordel (18-01-2013 14:31:23)
Hors ligne
Bon... après épluchage des docs Novell... j'ai mis en place un programme qui permet de mettre en place des rendez-vous (via Object API Novell).
Par contre, je suis bloqué à un endroit car... si le poste sur lequel on déploie l'appli ne dispose pas d'un client groupwise, alors les méthodes de l'API ne fonctionnent pas (normal).
De ce fait, je voulais savoir si certains savent s'il y a moyen de compiler le programme avec des dll spécifiques pour que tout soit OK ?
Merci d'avance.
Hors ligne
Salut et bonanné
pour ton problème ben... je dirais que c'est un problème GroupWise, pas un problème PB, ça me parait normal qu'il n'y ait rien là dessus dans la doc PB sinon il faudrait une doc PB qui reprends tous les programmes existants avec lesquels on pourrait vouloir interagir un jour.
Donc pour les dll c'est pareil, il te faut logiquement les dll spécifiques à GroupWise, à toi de voir si tu ne peux pas éventuellement les packager avec le reste de ton appli afin d"être sûr qu'elles soient installés sur le poste client où tu exécutes PB.
Hors ligne
Oui... je suis conscient que le problème n'est pas du ressort de PB... mais je me demandais si dans la communauté, il y avait un "foromeur" (ce n'est pas sale) qui savait exactement quelles dll sont à packager ;)
C'est toujours un gain de temps et évite diverses tergiversations inutiles :P
Dommage pour moi
Hors ligne
Dependency Walker est peut-être ton ami : c'est un outil fait par quelqu'un de chez Microsoft (et dont certaines versions sont distribuées avec Visual Studio) qui te permet de lister quelles sont les modules externes nécessaires à une application.
- dès le démarrage
- ou chargées plus tard pendant l'exécution (on peut aussi tracker des problème d'exécution et tout un tas de choses intéressantes )
En gros
- tu installes dependencywalker.exe
- tu ouvres ton exe avec (il y a moyen de simplifier et d'ajouter au menu contextuel des .exe "View dependencies", il faut voir avec le menu "options / configure handled file extensions")
- tu as déjà les dépendances immédiates (pour que l'exe accepte de démarrer)
- tu démarres ton appli en mode profilage ("Profile / start profiling") ça va noter tous les chargements ultérieurs de dll (attention, ça ralentit aussi le fonctionnement)
- dans l'appli PB tu vas dans toutes les fonctionnalités histoire de ne pas louper une dll (exemple : dans la capture d'écran plus bas, on ne voit pas scilexer.dll, mais je sais que l'appli en a besoin seulement je suis pas allé dans un écran qui l'utilise pendant ma démo)
- dans dependency walker, tu obtiens un arbre des dépendances de dll et également une liste globale (je te conseille d'y faire un clic-droit / "full path" pour savoir où sont ces dll)
- tu n'as plus qu'à faire le tri entre les dll système, les "erreurs normales" de dll non trouvées (exemple: l'appli qui cherche kernel32.dll dans le répertoire de l'application) et les dll que tu as vraiment besoin de déployer
Exemple :
Dernière modification par seki (28-01-2013 13:16:19)
Hors ligne
Ho un nouveau copain !
Je teste cela et je vous tiens au courant
PS : je venais juste de trouver un lien vers un topic parlant de ce soft justement
Hors ligne
Bon... premiers essais et toujours une erreur que je n'arrive pas à résoudre malgré les infos glanées sur google et sur le site du soft :
Second chance exception 0xC0000005 (Access Violation) occurred in "c:\dll_path\PBVM120.DLL" at address 0x10CB4D0C.
Une idée, vous avez, Seki ?
(Yoda Style)
Hors ligne
Mmmh, tout ce que je peux dire avec cette erreur, c'est que la VM de PB 12 plante en essayant d'accéder à une adresse mémoire invalide (pointeur erronné, bloc de mémoire libéré une nouvelle fois par erreur, ...).
Çà se produit sur le poste ou le client Groupwise est correctement installé ?
Est-ce que ça plante aussi en dehors de dependency walker ?
Hors ligne
Alors... je viens de débusquer le problème... ce sont les librairies APPEON qui font planter le tout !
J'ai viré ces goujateries de mon projet, j'ai bidouillé pour ne plus avoir besoin d'elles... et hop ça fonctionne
Je m'en vais de ce pas tester le Texas Ranger de la dépendance ! ;)
Hors ligne
J'ai maintenant ma liste de DLL... mais une fois incluses dans mon appli portée sur APPEON... j'ai toujours aucune prise en charge des fonctions Novell...
Bizarre !
Je vais tester en créant un simple exe avec les DLL notées...
Hors ligne
Bon... bon... bon... N'avançant toujours pas dans le sens escompté, j'ai fait des recherches pures autour de la création d'événements dans des agendas.
Et parmi mes recherches diverses et variées, je suis tombé sur ce type de script PHP :
<?php $to = ""; $from = ""; $subj = ""; $msg = ""; $method="REQUEST"; $file_att_type = "text/calendar; method=PUBLISH"; $file_att_name = "metting.ics"; $mime_boundary = "==Multipart_Boundary_x{" . md5(mt_rand()) . "}x"; $header = "From: " . $from . "\r\n" . "MIME-Version: 1.0\r\n" . "Content-Type: multipart/mixed; boundary=\"{$mime_boundary}\""; $cal_uid = "{" . date('Ymd').'T'.date('His')."-".rand()."@cordys.com}"; $cal_msg = "BEGIN:VCALENDAR PRODID:-//Novell Inc//Groupwise 8.0.2 VERSION:2.0 METHOD:" .$method . " BEGIN:VEVENT DESCRIPTION: meeting description, line 1 of 2.\nline 2 of 2.\n\n SUMMARY: meeting subject X-GWITEM-TYPE:APPOINTMENT DTSTAMP:20120328T150401Z TRANSP:OPAQUE X-GWSHOW-AS:BUSY DTSTART:20130131T120000 DTEND:20130131T130000 LOCATION: my meeting location UID:" . $cal_uid . " PRIORITY:5 X-GWCLASS:NORMAL CLASS:PUBLIC STATUS:CONFIRMED BEGIN:VTIMEZONE TZID:Europe/Paris END:VTIMEZONE END:VEVENT END:VCALENDAR"; $msg = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: $file_att_type; name=$file_att_name\n" . "Content-Disposition: inline; filename=$file_att_name\n" . "Content-Transfer-Encoding: base64\n\n" . chunk_split(base64_encode($cal_msg)) . "\n\n" . "--{$mime_boundary}--\n"; (mail($to, $subj, $msg, $header, "")); ?>
Ma question est donc toute simple... Peut-on effectuer ce même type d'envoi de mail via PB ???
Est-ce qu'une librairie externe permettrait de le faire ? Genre http://www.topwizprogramming.com/freeco … lsmtp.html ou http://pbnismtp.codeplex.com/
Merci d'avance
Hors ligne
Bonjour,
Il existe une norme pour l'échange de données dans les agendas : iCalendar voir http://fr.wikipedia.org/wiki/ICalendar
En survolant rapidement le script PHP, je pense qu'il s'agit d'une envoi à cette norme.
Sans problème, tu peux utiliser la librairie de topwizprogramming. Je l'utilise moi-même.
Hors ligne
Ah cool merci Buck Cela me réconforte quelque peu
Par contre, petite interrogation comme ça, sans avoir creusé la chose...
Suis-je obligé de passer par un .ics ou je peux directement envoyer un rendez-vous dans l'agenda ???
Encore merci
Hors ligne
Alors... j'ai réussi à envoyer un fichier .ics... mais ce dernier n'est pas automatiquement ajouté à l'agenda.
Il faut que l'utilisateur l'ouvre et valide... pas top.
A la manière de PHP... puis-je faire du multipart en PB ??? (à ma connaissance non)
Hors ligne
Bonjour,
Avec cette norme, tu ne peux pas ajouter directement un rendez-vous dans l'agenda du destinataire :
iCalendar permet aux utilisateurs d'envoyer des demandes de rendez-vous, et de les transmettre à d'autres utilisateurs via emails. Les destinataires de l'email contenant l'iCalendar (s'ils possèdent un logiciel le supportant) peuvent facilement répondre à l'expéditeur ou proposer une autre date/heure de rendez-vous.
Le destinataire final doit accepter le rendez-vous pour l'ajouter à son agenda, ce qui me parait normal.
La librairie smtp topwizprogramming contient tout le nécessaire pour faire un envoi anologue au script PHP.
Hors ligne
Merci pour la réponse Buck ;)
Par contre, j'ai trouvé une autre version du script PHP où voici la variable envoyée dans le mail :
$msg = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=UTF-8\n" . "Content-Transfer-Encoding: 8bit\n\n" . "Item Type: Appointment\n" . $msg . "\n\n--{$mime_boundary}\n" . "Content-Type: $file_att_type; name=$file_att_name\n" . "Content-Disposition: inline; filename=$file_att_name\n" . "Content-Transfer-Encoding: base64\n\n" . chunk_split(base64_encode($cal_msg)) . "\n\n" . "--{$mime_boundary}--\n";
Et cela... permet d'envoyer un mail avec le Rendez-vous à accepter mais aussi... cela le place automatiquement dans l'agenda (en attente de validation).
C'est donc cela que j'essaie de reproduire !
Dernière modification par jordel (01-02-2013 14:10:34)
Hors ligne
Et bien, plusqu'à traduire cette construction de chaîne en pbscript !
Hors ligne
J'ai contourné le problème en créant un webservice à partir de ce script PHP... Une fois appelé en PB... plus aucun souci
Par contre... je teste en passant par une classe Java (bah, oui tant que j'y suis, je m'amuse) et là, je rencontre un petit souci...
La création de ma classe Java est OK... la compil également... l'intégration avec l'objet ejb_proxy est OK...
Par contre, dès que je lance mon prog PB, j'ai toujours un blocage au niveau du CreateJavaInstance qui renvoie -1 "Failed to create Java class."
Au cas ou, voici mon code :
string properties[] string ls_classpath boolean lb_debug long ll_return EJBConnection lEJBConn EmailRDV lnv_simple lb_debug = false ls_classpath = "Path\APPT_EMAILING\Java" i_jvm = create javavm TRY IF i_jvm.createJavaVM(ls_classpath, lb_debug) >= 0 THEN lEJBConn = CREATE EJBConnection ll_return = lEJBConn.CreateJavaInstance( lnv_simple, "EmailRDV") IF ll_return <> 0 THEN MessageBox("", "CreateJavaInstance returned " +string(ll_return)) destroy lEJBConn ELSE TRY lnv_simple.send() CATCH (CreateException ce) MessageBox( "Create Exception", ce.getMessage() ) CATCH (Throwable t) MessageBox(" Other Exception", t.getMessage()) END TRY END IF ELSE MessageBox("createJavaVM", "Failed", StopSign!) DESTROY i_jvm END IF CATCH (Throwable g) MessageBox("Exception in createJavaInstance", g.getMessage()) END TRY
Aurais-je zappé quelque chose dans le process ???
Dernière modification par jordel (11-02-2013 09:10:03)
Hors ligne
Bonjour,
Je n'ai jamais fait. Mais je pense qu'il peut s'agir d'un problème de version de Java. Tu n'aurais pas compilé ta classe en version 7 alors que les versions pris en charge par PB sont 1.5.XX ou 1.6.XX selon ta version de PB (C:\Program Files\Sybase\Shared\Powerbuilder\jdk1.X.X_XX).
Hors ligne
Bon... ça passe dans le " Other Exception" mais ça passe, c'est déjà ça
Hors ligne
Finalement... je vais laisser tomber l'ejb car ce n'est pas portable sur APPEON
Mais en tout cas... c'est pas mal pour importer du java dans ses projets PB et ça fonctionne nickel
Hors ligne
Re-bonjour à tous
Je continue mes tentatives et comme ça je teste de nouvelles choses dans PB Et là, je me suis tourné vers la création en C# d'une DLL qui permet d'envoyer un rdv de type VCALENDAR.
Quand je compile mon code C#en EXE et que j'exécute, all is right... donc je décide de porter cela en DLL pour appeler une fonction via les fonctions externes dans PB.
Ayant sans cesse des "runtime error"... j'ai lancé l'appli avec Dependency Walker et voilà ce qui me gène :
LoadLibraryW("d:\path_to_app\SendVcal.dll") called from "c:\dll_pb\PBSHR120.DLL" at address 0x0043E0A0.
Loaded "c:\windows\system32\MSCOREE.DLL" at address 0x79000000. Successfully hooked module.
DllMain(0x79000000, DLL_PROCESS_ATTACH, 0x00000000) in "c:\windows\system32\MSCOREE.DLL" called.
GetProcAddress(0x7C800000 [c:\windows\system32\KERNEL32.DLL], "FlsAlloc") called from "c:\windows\system32\MSCOREE.DLL" at address 0x79006F3C and returned NULL. Error: La procdure spcifie est introuvable (127).
GetProcAddress(0x7C800000 [c:\windows\system32\KERNEL32.DLL], "FlsGetValue") called from "c:\windows\system32\MSCOREE.DLL" at address 0x79006F49 and returned NULL. Error: La procdure spcifie est introuvable (127).
GetProcAddress(0x7C800000 [c:\windows\system32\KERNEL32.DLL], "FlsSetValue") called from "c:\windows\system32\MSCOREE.DLL" at address 0x79006F56 and returned NULL. Error: La procdure spcifie est introuvable (127).
GetProcAddress(0x7C800000 [c:\windows\system32\KERNEL32.DLL], "FlsFree") called from "c:\windows\system32\MSCOREE.DLL" at address 0x79006F63 and returned NULL. Error: La procdure spcifie est introuvable (127).
GetProcAddress(0x7C800000 [c:\windows\system32\KERNEL32.DLL], "EncodePointer") called from "c:\windows\system32\MSCOREE.DLL" at address 0x7900315A and returned 0x7C9233FF.
Je voulais avoir vos avis et votre aide... car je n'arrive pas à bypasser ce souci
Dernière modification par jordel (22-02-2013 08:39:25)
Hors ligne
Kernel32 c'est le noyau windows.
MSCoree c'est "Microsoft .NET Runtime Execution Engine", le moteur de .Net
Les lignes que tu as mis en rouge, ce sont des tentatives pour trouver de manière dynamique avec GetProcAddress des fonctions relatives aux "fibres" (FlsAlloc, FlsGetValue, FlsSetValue, FlsFree avec fls = fiber local storage, une "unité d'exécution" - un truc lié au multithread) dans la dll du noyau.
En gros, au lieu d'un linkage directement dans la table d'import de la dll de ces fonctions (dans ce cas, si la dll importée ne trouve pas les fonctions dont elle énumère la liste, elle ne parvient pas à se charger et l'application qui va avec ne démarre pas et on voit un message indiquant qu'elle n'arrive pas à trouver une fonction censée être exportée par la dll), on passe par GetProcAddress() qui va chercher la fonction et retrouver son adresse ou NULL (pas trouvée) pour pouvoir l'appeler si on l'a trouvée.
Je suppose que le runtime .Net, qui peut être installé sur différentes versions de Windows, utilise ça pour vérifier les fonctionnalités de windows disponibles sur le système où il est.
Est-ce que le système où tu testes ça est XP ? parce que d'après MSDN ces fonctions ne sont disponibles en client qu'à partir de Vista, et 2003 en serveur.
Je ne pense pas que ce soit un problème, simplement DependencyWalker te montre toutes les accès à des dll, réussis ou non.
Hors ligne
Merci pour les infos Seki
Oui, je teste ça sur XP mais je pensais que l'install du .net framework 4 suffirait pour lancer l'appli !
Là... typiquement quand je lance mon appli (non encore APPEONisée) j'ai un vilain message "PB application execution error (R0021)".
L'infâme me précise que "Error : Bad runtime function reference at line 87 in function gf_envoi_mail_dll of object gf_envoi_mail_dll"
A cette fameuse ligne 87, j'ai mon appel à ma fonction externe...
Hors ligne