Étiquette : WinDev

Vincent Lecomte
[WD21] Erreur vTable invalide à l’adresse X

[WD21] Erreur vTable invalide à l’adresse X

Depuis hier l’Update 3 des éditeurs Windev, Webdev et Windev Mobile est disponible. Il s’agit de la version ayant passé avec succès le premier niveau de validation donc celle-ci n’est pas définitive. Installée sur deux PC différents, impossible de développer sans obtenir une erreur de ce genre :

vTable invalide à l'adresse 0x1f8e00e5
Pile:
0x1f8e00e5
0x7c406e56
0x98a28ab0
0x440f3678
0x601f527a

Cette erreur – qui apparait au bout d’une minute ou deux – est généralement liée au dongle / aux drivers de celui-ci (Sentinel HASP). Seulement voilà, les pilotes installés sont bien les derniers (7.41), et le problème se produit aussi bien sur Windows 8.1 que sur la 10.

Et bien sûr… Impossible d’aller plus loin. La seule issue possible est de cliquer sur le bouton Fermer. L’erreur a été signalée au support technique plus tôt dans l’après-midi, ainsi que sur les forums.

Si comme moi vous avez pris l’habitude de décocher la sauvegarde lors de l’installation des mises à jour de produits PC SOFT, alors vous risquez d’être à l’arrêt en attendant un correctif. Espérons que ça ne soit pas trop long…

Edit du 1/6/2016 – Pour information le bug se produit sur Windows 8.1 et 10 mais surtout, sur 3 machines au total, ayant des périphériques USB complètement différents. Tous étaient en Update 2 et Windev fonctionnait sans problème jusqu’à cette mise à jour.

Edit du 2/6/2016 – J’ai effectué quelques tests en ne laissant branché qu’un dongle et le phénomène est le même. J’ai dû lancer un outil de diagnostic et transférer un fichier au support, malheureusement en cette fin d’après-midi je n’ai aucune réponse concrète. J’ai en attendant désinstallé les pilotes et les 2 dongles, puis réinstallé proprement le dernier driver Sentinel HASP, sans succès.

Edit du 3/6/2016 – 3 jours déjà mais on tient le coup. Après l’exécution de l’outil de diagnostic, le support a relevé un conflit, sans en dire beaucoup plus. Si celui-ci est confirmé après l’envoi du deuxième fichier, l’article sera mis à jour en conséquence.

Le conflit est en fait dû à un pilote HP pour les claviers (à priori HP Hotkey Support). PC SOFT m’a envoyé un correctif, que vous pouvez télécharger en cliquant sur ce lien (pack_fr_98553.zip).

Ensuite, décompressez les exécutables de Webdev 21 dans :

Webdev21.exe, Webdev 21\Programmes
Webdev64local.exe, Webdev 21\Programmes
Webdev64net.exe, Webdev 21\Programmes
– Données\Webdev.wdl, Webdev 21\Programmes\Données

Idem pour Windev:

Windev21.exe, Windev 21\Programmes
Windev64local.exe, Windev 21\Programmes
Windev64net.exe, Windev 21\Programmes
– Données\Windev.wdl, Windev 21\Programmes\Données

Idem pour Windev Mobile :

Wd21Mobile.exe, Windev Mobile 21\Programmes
Windevmobile64local.exe, Windev Mobile 21\Programmes
Windevmobile64net.exe, Windev Mobile 21\Programmes
– Données\Windev Mobile.wdl, Windev Mobile 21\Programmes\Données

[.NET] ITextSharp : document protégé

[.NET] ITextSharp : document protégé

Nous avons vu il y a déjà quelques mois comment appliquer un filigrane sur toutes les pages d’un fichier PDF (voir liens suivants) :

J’avais utilisé cette astuce provenant d’un utilisateur des forums PC SOFT, afin de pouvoir réimprimer des factures avec un joli “DUPLICATA” affiché en oblique. Mais ce que je n’avais pas pris en compte, ce sont les fichiers auxquels j’avais mis un mot de passe pour bloquer la modification. Ces documents pouvaient être ouverts, imprimés mais leur contenu était verrouillé…

Du coup, lors de l’appel de la procédure qui ajoute le petit filigrane, cela me générait une jolie exception avec l’erreur PdfReader not opened with owner password.

Zut alors ! Mais comment faire pour que ça marche sans pour autant spécifier de mot de passe. En fait j’ai simplement spécifié un paramètre, juste après l’initialisation de ma variable MonFichierPDF de type PdfReader, qui permet d’apporter des modifications au flux chargé.

PdfReader.unethicalreading = true;

Et bim ! Je relance la procédure en passant comme source un fichier protégé par mot de passe (pour la modification) et cette fois ça marche. Super ! Notez enfin que cette syntaxe fonctionne dans la procédure Windev qui avait été détaillée dans les deux articles ci-dessus.

[WD21] Problème d’image dans l’éditeur d’aide

[WD21] Problème d’image dans l’éditeur d’aide

Lorsque vous éditez une page d’aide dans Windev, vous pouvez rencontre la situation suivante (encore un bug me direz-vous) :

  • Insérez une image dans votre page d’aide.
  • Sauvegardez les propriétés lorsque la fenêtre s’affiche.
  • L’image apparait.
  • Double-cliquez sur l’image pour modifier ses propriétés (ex : l’échelle).
  • Validez : l’image disparait aussitôt, supprimant parfois partiellement ou entièrement le contenu de la page.

Vous pouvez également voir un X apparaitre à la place de l’image insérée. Cela est en fait dû à un problème d’enregistrement d’une DLL de l’éditeur.

La FAQ #9637 m’a permis de résoudre le problème (merci au support).

Ouvrez une invite de commandes en administrateur.

  • Fermez Windev.
  • A l’aide de la commande “cd” positionnez-vous dans C:\Program Files (x86)\PC SOFT\WINDEV 21\Programmes (cela peut aussi être C:\Windev 21\Programmes si le logiciel a été installé sans respecter la norme Windows).
  • Exécutez ensuite la commande : regsvr32 wdaidex.dll (NB : wdaidex64.dll si Windev est installé en version 64 bits).
  • Vous devriez voir apparaitre un message indiquant la réussite de l’opération. Fermez l’invite de commande.
  • Ouvrez Windev et voyez si cela a résolu le problème.

Pour moi, cela a résolu le premier problème que j’ai mentionné ci-dessus.

[WD21] Envoyer un email (II)

[WD21] Envoyer un email (II)

Nous avions vu il y a presque un an comment envoyer un email à l’aide de Windev. Cette fois nous allons utiliser les structures mises à notre disposition pour faciliter la programmation. C’est surtout au niveau de la connexion qu’il va y avoir du changement.

Connexion

Nous allons utiliser une structure de type EmailSessionSMTP. On va alors passer toutes les options à l’aide des différentes propriétés, puis appeler la fonction EmailOuvreSession() en passant cette unique variable.

MaSession est un EmailSessionSMTP
MaSession..AdresseServeur = GP_Param_s_SMTPServer
MaSession..Port = GP_Param_i_SMTPPort
MaSession..Nom  = GP_Param_s_SMTPUsername
MaSession..MotDePasse = GP_Param_s_SMTPPassword
MaSession..Option = emailOptionSécuriséTLS
bOpenSessMail = EmailOuvreSession(MaSession)

Il faudra ensuite tester le booléen pour voir si la session est ouverte.

Préparer le message

Pour le coup, rien ne change. On construit le message à l’aide d’une variable de type Email.

MonMessage est un Email
MonMessage..AdresseExpéditeur = GP_Param_s_SMTPExpe
MonMessage..Expediteur  = "Nom <" + GP_Param_s_SMTPExpe + ">"
MonMessage..Sujet = "Reporting du 28/4/2016"
MonMessage..Message = "Contenu du message au format brut"

Il faut bien entendu spécifier les destinataires (à, Cc, Cci) :

Ajoute(MonMessage..Destinataire,sDesti)
Ajoute(MonMessage..Cc,GP_Param_s_SMTPCopyTo)
Ajoute(MonMessage..Cci,GP_Param_s_SMTPCopyTo2)

Ou une pièce jointe (par exemple un fichier PDF) :

monAttache..Nom=fExtraitChemin(sFile,fFichier+fExtension)
monAttache..Contenu=fChargeTexte(sFile)
monAttache..ContentType="application/pdf"
monAttache..ContentDescription="PDF Document"
Ajoute(MonMessage..Attache, monAttache)

Une fois que c’est fait, on peut envoyer…

Envoyer l’e-mail

Notre message est prêt : c’est parti ! Nous allons maintenant l’envoyer et puis fermer la session précédemment ouverte (voir plus haut). Nous allons utiliser la fonction EmailEnvoieMessage(). 2 paramètres doivent être passés en entrée : la structure contenant les infos de la session, et celle contenant les informations du message.

SI PAS EmailEnvoieMessage(MaSession,MonMessage) ALORS
 Erreur(ErreurInfo(errMessage))
SINON
 Utility.displayGreenToast("Email envoyé")
FIN

Ensuite, fermer la session…

EmailFermeSession(MaSession)

Et voilà 😉

[WD21] Activation du Dump de débogage

[WD21] Activation du Dump de débogage

Quand WinDev se casse lamentablement la poire en indiquant que l’application a cessé de fonctionner et que Windows recherche une solution, vous avez la possibilité d’activer la génération du “dump de débogage“. Il ne restera alors qu’à essayer de reproduire le bug afin d’envoyer le fichier au support technique.

Ouvrez le menu Aide, ensuite cliquez sur “A propos de WINDEV“.

Tout en maintenant la touche CTRL enfoncée, cliquez sur le logo de WD, qui se trouve juste à droite des informations de version. Une boite de dialogue apparait alors.

Cliquez sur le bouton “Activer pour 10 jours“. Redémarrez ensuite l’EDI. Vous constaterez un changement au niveau des couleurs de l’interface pour vous indiquer que le débogage est actif. Essayez alors de reproduire votre bug ; si WD se plante, un fichier dump est alors généré dans C:\PCSOFTDUMP. Transmettez alors le fichier au support. Pour désactiver le mode de débogage, retournez dans la fenêtre “A propos“, effectuez de nouveau un CTRL+Clic sur le logo, puis choisissez tout simplement “Désactiver”. Relancez à nouveau pour que les changements soient effectifs.

Gardez à l’esprit que, malheureusement, PC SOFT n’interviendra pas si vous utilisez une version antérieure à celle qu’ils proposent en téléchargement / achat. En effet, une fois la nouvelle version sortie, il n’y a (presque) plus la possibilité de demander un patch correctif.Notez enfin que l’astuce fonctionne pour toutes les versions (et les éditeurs), même si la façon d’accéder à la fenêtre “A propos” peut différer.

[.NET] ITextSharp : lire les métadonnées d’un PDF

[.NET] ITextSharp : lire les métadonnées d’un PDF

En C# .NET, à l’aide de la librairie ITextSharp, on peut facilement lire les métadonnées d’un document. Pour rappel il s’agit d’une DLL qui permet de manipuler des documents PDF : parsing, ajout de filigranes, etc. Vous pouvez l’obtenir sur Sourceforge.

PdfReader p = new PdfReader(
	System.IO.File.ReadAllBytes("file.pdf") 
); 

string s = p.Info["CreationDate"];

A l’aide de Windev, on peut aussi effectuer un appel à ces fonctions .NET. Chargez l’assemblage dans votre projet, ensuite utilisez le code suivant. Attention : les tableaux d’objets ne sont pas pris en charge, il faudra donc utiliser une petite variante.

pclRead est un PdfReader dynamique <- allouer un PdfReader(File.ReadAllBytes(sInFile))
clInf est un Hashtable <- pclRead.Info
sTest = clInf.get_Item("CreationDate")

Et le tour est joué ! Dans notre exemple nous avons récupéré la date de création. Il est retourné sous cette forme : “D:AAAAMMJJ” suivi de l’heure. Bon développement !

[WD21] La pré-version en téléchargement

[WD21] La pré-version en téléchargement

Vous pouvez dès à présent télécharger la pré-version de l’AGL Windev, développé par PC SOFT. Il s’agit de la version 21 01F210039d. Si vous possédez déjà vos licences pour exécuter l’environnement, alors vous allez pouvoir découvrir les nombreuses nouveautés présentées au TDF et dans le magazine.

Attention, il ne s’agit pas de la version finale. Certaines fonctionnalités ne sont peut-être pas encore actives et d’autres peuvent tout simplement être instables. Ne migrez donc pas vos applications existantes dans cette version.

Qu’y-a-t-il de nouveau ?

  • Télémétrie : permettez aux applications de collecter et envoyer des données à un serveur pour faciliter le développement. A tout moment vous pourrez savoir quelles sont les fenêtres les plus / moins utilisées, obtenir le détail des erreurs qui se sont produites sur les différents postes, etc.
  • Champ note : si vous utilisiez déjà les notes intégrées à Windows, vous devriez vous habituer à celles de Windev. Rédigez des notes directement depuis les applications. Celles-ci peuvent alors être déplacées et sont également mémorisées et restaurées à chaque lancement du logiciel. Elles sont bien sûr programmables.
  • Amélioration des éditeurs : interface épurée, mémorisation de l’état de l’explorateur de projets, support des hautes résolutions (4K), affichage des raccourcis dans les menus contextuels, recherche avancée en langage (presque) naturel, fenêtre des 7 onglets non modale lors de l’édition d’états, et encore bien d’autres petites nouveautés ici et là.
  • Modification de l’interface utilisateur… par l’utilisateur : cette fonctionnalité permettra aux utilisateurs de modifier la position et la taille des champs à leur guise et ce sans modifier l’agencement initial. Les informations sont mémorisées et l’utilisateur retrouvera sa configuration au prochain lancement de l’application. Et bien sûr, il sera possible à tout moment de revenir à l’interface initialement prévue par le développeur.
  • Modification des fenêtres pendant le débogage : en plein développement et donc en pleine opération “go”, vous pourrez modifier l’agencement de vos champs et répercuter cela dans l’éditeur de fenêtres de Windev.
  • Compression de chaines “gzip”.
  • Nouveaux formats d’archivage TAR et GZ.
  • Accès natif à la base de données Hadoop.
  • Authentification Facebook à partir de vos applications mobile.
  • Nouvelles fonctionnalités pour les développements mobile : effet de parallaxe sur les images lors du défilement, développement pour les terminaux tels que les iWatch ou iPhone 6S, support des protocoles FTP/FTPS, support de 3D Touch pour les périphériques Apple compatibles, support de l’écriture sur les cartes SD à partir d’Android, etc.
  • HFSQL : nouvelles fonctions, notamment pour les dates et les heures, ou la conversion, nouveaux types, récupération de l’utilisateur courant (CURRENT_USER), “explain” visuel dans le centre de contrôle du serveur, etc.
  • Responsive Web Design : si vous utilisez Webdev, la conception de vos sites “responsive” sera plus facile. L’agencement d’une page pourra être défini en fonction d’une ou plusieurs résolutions / plateformes afin de faire bénéficier aux internautes d’une expérience de navigation optimale.
  • Universal Windows 10 Apps : développez des applications dites responsive pour un déploiement sur plusieurs types de périphériques Windows 10 (mobile, desktop, etc). Plus d’informations : “A first look at the Windows 10 Universal app platform“.

Vous vous doutez que cette liste est loin d’être complète. Vous pouvez consulter la brochure disponible sur le site de PC SOFT pour obtenir plus d’informations ou tout simplement télécharger cette nouvelle version.

Bon développement à tous.

[WD20] Remplir plusieurs cellules Excel par OLE

[WD20] Remplir plusieurs cellules Excel par OLE

Cette technique permet de gagner en performances lorsqu’on cherche à piloter Excel à l’aide d’OLE Automation. En effet, si par exemple on cherche à alimenter les cellules A1 à B5 (soit 10 cellules, sur deux colonnes distinctes), on va pouvoir utiliser un tableau de variants à 2 dimensions. La solution a été proposée sur les forums de PC SOFT par Jurassic Pork.

Si vous ne vous souvenez plus de la manière dont il faut déclarer les différentes variables afin de piloter Excel, vous pouvez consulter l’article “Pilotage Excel via OLE” sur le blog. Dans notre exemple nous allons déclarer des objets supplémentaires qui représenteront respectivement une feuille spécifique et une plage de cellules.

MaFeuille est un objet automation dynamique
MaPlage est un objet automation dynamique
MonTableauAutomation est un tableau de 5 par 2 Variant

MaFeuille = objXLApp>>Worksheets("Feuil1")
POUR i = 1 A 5
  MonTableauAutomation[i,1]="Donnée_A_" + i
  MonTableauAutomation[i,2]="Donnée_B_" + i
FIN

MaPlage = MaFeuille>>Range("A1:B5")
MaPlage>>Value = MonTableauAutomation

Dans le code ci-dessus on a volontairement supprimé l’ouverture du classeur et le test pour vérifier s’il a bien été chargé. La déclaration de l’objet “objXLApp” n’est d’ailleurs pas présente ici.

Bon développement à tous.

[WD20] Récupérer l’e-mail dans l’AD avec .NET

[WD20] Récupérer l’e-mail dans l’AD avec .NET

Si vous avez besoin, pour une raison une autre, de récupérer des informations depuis l’Active Directory pour l’utilisateur déjà connecté sans utiliser les fonctions de la famille LDAP*, alors vous pouvez utiliser l’assemblage “System.DirectoryServices” de .NET. Dans l’explorateur de projets, effectuez un clic droit sur “Assemblages .NET” puis choisissez l’option “Utiliser un assemblage” du menu contextuel.

La première étape consiste à initialiser les variables pour lancer la recherche. Pour cela on a besoin de trois types d’objets :

  • DirectoryEntry : qui encapsule un nœud/un objet dans la hiérarchie de l’AD.
  • DirectorySearcher : pour rechercher à partir d’une position spécifique.
  • Environment.UserName : nom de l’utilisateur authentifié.

Ensuite il faut initialiser le filtre de la recherche et indiquer les propriétés que l’on souhaite récupérer. Dans notre exemple nous souhaitons obtenir l’e-mail (“mail”) mais également d’autres informations (comme le prénom et le nom).

On doit ensuite lancer la recherche à l’aide de la fonction “FindOne”, qui va simplement renvoyer le premier objet répondant aux critères. Si la variable qui en résulte est différente de Null, alors on peut parcourir les propriétés. Pour rappel, Windev ne gère pas les tableaux .NET, il va donc être impossible de récupérer un objet en indiquant la clé ou l’index.

Pour contourner nous avons utilisé une boucle de type “POUR TOUT” (équivalent à un “foreach” en C#) afin de parcourir l’ensemble des noms de propriétés. Ensuite, nous avons récupéré une collection d’objets correspondants à la clé “mail” grâce à la procédure “get_Item()“.

Il ne reste plus qu’à parcourir cette collection pour récupérer la valeur. Normalement il n’y en a qu’une puisqu’on a demandé à ne reprendre que le premier objet correspondant à nos critères de recherche. On stocke donc la valeur dans une simple variable chaine.

Bon développement !

[WD20] Envoyer un e-mail

[WD20] Envoyer un e-mail

Pour envoyer un e-mail depuis votre application Windev, vous pouvez notamment utiliser la fonction LanceAppliAssociée() qui ouvrira la messagerie par défaut. Le paramètre à préciser est en fait une chaine qui contiendra l’URL “mailto”. Celle-ci pourra contenir des champs pré-remplis (sujet, destinataire, fichier à attacher). Bien sûr, pour que cela fonctionne, il faut qu’un logiciel de messagerie soit associé à ce protocole. Pour information la fonction ne peut pas être utilisée dans une application Linux.

Il y a une autre solution qui peut être mise en place dans Windev : l’utilisation des variables et fonctions Email. Grâce à ces éléments il va être possible d’envoyer un e-mail à travers le protocole IMAP ou SMTP, ou même en utilisant un profil Outlook.

Envoyer à l’aide d’une connexion SMTP

On déclare tout d’abord dans notre code une variable qui sera de type Email. On va appeler celle-ci “eMonMessage“. Elle contient de nombreuses propriétés qui permettent de modifier les caractéristiques du message (sujet, contenu, destinataires, etc). L’avantage par rapport à la structure proposée par Windev, c’est qu’il n’est pas obligatoire d’indiquer explicitement le nombre de destinataires (à/cc/cci) avant de spécifier leurs adresses. C’est donc un gain de temps !

Parmi les propriétés qu’on peut spécifier :

  • Sujet : texte contenant le sujet de votre message.
  • Expéditeur : champ “From” de l’en-tête du message ; peut contenir un e-mail ou du texte (exemple : NOM ).
  • Destinataire : tableau contenant les adresses e-mail des destinataires. On peut ajouter les éléments à l’aide de la fonction Ajoute (eMonMessage..Destinataire, “email”).
  • Cc / Cci : tous deux des tableaux, permettent d’ajouter des destinataires en copie conforme (invisible ou non). On peut aussi utiliser la fonction Ajoute() pour les remplir.
  • Message : texte au format brut ; si on ne souhaite pas utiliser de mise en forme spécifique. Certains destinataires préfèrent en effet recevoir des messages sans formatage.
  • HTML : si on souhaite avoir une mise en forme il faut alors spécifier le contenu en HTML. On pourra l’importer depuis un fichier (avec toutes les images associées) ou saisir directement le code.

Exemple :

Sur l’image on peut voir qu’on renseigne bien l’expéditeur, le sujet, le contenu du message (texte brut) ainsi que le destinataire. Dans cet exemple vous constaterez que les adresses e-mail sont stockées dans des variables locales.

Attacher un fichier

Il est possible d’attacher un ou plusieurs fichiers à votre e-mail. Vous pouvez soit passer par la variable EmailAttache, soit utiliser la fonction EmailChargeFichierAttaché(). Cette dernière est très pratique car il n’est pas nécessaire de s’occuper de charger le contenu du fichier à l’aide de code supplémentaire ou de définir le type MIME. On passe en paramètre la variable de type Email et le chemin du fichier à attacher.

Bien sûr si vous souhaitez utiliser la variable EmailAttache, vous pouvez toujours consulter l’exemple dans la documentation officielle de PC SOFT. En résumé, il suffit de spécifier les propriétés Nom, Contenu (on utilise fChargeTexte() pour ça), ContentType (type MIME) et ContentDescription, puis de l’ajouter dans le tableau des fichiers attachés de notre message initial.

Ouvrir la session et envoyer le message

On va ici ouvrir la session à l’aide de la fonction EmailOuvreSessionSMTP() qui renvoie un booléen pour déterminer si la connexion a abouti. Les paramètres de cette fonction sont, dans l’ordre :

  • Nom d’utilisateur ; celui-ci sera réutilisé en tant qu’identifiant de session.
  • Mot de passe : lié au compte utilisateur.
  • Serveur : adresse IP ou nom DNS du serveur auquel on se connecte.
  • Port : port lié au serveur (ex : 25 par défaut, 587 pour une connexion TLS).
  • Mode asynchrone : utilisé uniquement pour le web.
  • Options : facultatif, à utiliser dans le cas d’une connexion TLS/SSL.

Exemple :

Ensuite, comme on peut le voir dans l’exemple ci-dessus, on va appeler la fonction EmailEnvoieMessage() si la session a bien été ouverte. En paramètre on spécifiera l’identifiant de la session SMTP (donc le nom d’utilisateur dans ce cas) et la variable Email qui a été construite lors des étapes précédentes. La fonction renvoie également un booléen pour indiquer si le mail est bien parti ou non. En cas d’erreur, on peut afficher les informations issues de ErreurInfo().

Il faut ensuite fermer la session avec EmailFermeSession(). Le paramètre est de nouveau l’identifiant de la session, qui est dans notre cas, le nom de l’utilisateur. Voilà, c’est terminé, vous savez désormais envoyer des e-mails avec Windev.