2017-02-24 3 views
0

Je souhaite définir des entrées de calendrier au format RTF, mais je ne sais pas comment passer l'octet [] à l'objet ActiveX, c'est-à-dire la propriété RTFBody.Comment définir la propriété byte [] du composant ActiveX à partir de Javascript?

Le code suivant lit la propriété RTFBody après un certain contenu a été défini - la lecture si l'octet [] fonctionne, mais lorsque je tente d'écrire exactement le même contenu (+ arrière 0) en arrière, ni un U/Int8Array ni Scripting.Directory travaux.

Peut-être qu'il est possible de contourner certains .NET objects, mais je ne sais pas comment instancier ces composants non-ActiveX. Une solution alternative ne devrait pas nécessiter de scripter les formats, par ex. "Aller à la ligne 2 et la rendre en gras", c'est-à-dire que j'aime générer la RTF via un modèle et coller seulement le résultat dans l'objet de calendrier.

Je suis conscient que cela doit éventuellement être codé en Windows-1252, mais pour commencer, je veux simplement voir les mêmes octets à écrire avec succès. Le script est exécuté dans un contexte HTA - la sécurité des scripts n'est donc pas un problème.

<html> 
    <head> 
     <hta:application id="foo" applicationname="foo" version="1" navigable="yes" sysMenu="yes"></hta> 
    </head> 
    <script language="JavaScript" type="text/javascript"> 
function doit2() { 
    var rtfBody = 
     "{\\rtf1\\ansi\\ansicpg1252\\deff0\\nouicompat\\deflang1031{\\fonttbl{\\f0\\fswiss\\fcharset0 Calibri;}}\r\n"+ 
     "{\\*\\generator Riched20 14.0.7155.5000;}{\\*\\mmathPr\\mwrapIndent1440}\\viewkind4\\uc1\r\n"+ 
     "\\pard\\f0\\fs22 bla\\par\r\n"+ 
     "}\r\n"; 
    // https://github.com/mathiasbynens/windows-1252 
    var rtfBody1252 = rtfBody; // windows1252.encode(rtfBody); 

    var dict = new ActiveXObject("Scripting.Dictionary"); 

    for (var i = 0; i < rtfBody1252.length; i++) { 
     dict.add(i, rtfBody1252.charCodeAt(i)); 
    } 

    dict.add(rtfBody1252.length, 0); 

    // Alternative setting via U/Int8Array also doesn't work ... 
    // var buf = new ArrayBuffer(rtfBody1252.length+1); 
    // var bufView = new Int8Array(buf); 
    // for (var i=0, strLen=rtfBody1252.length; i<strLen; i++) { 
    // bufView[i] = rtfBody1252.charCodeAt(i); 
    // } 
    // bufView[rtfBody1252.length] = 0; 

    var myOlApp = new ActiveXObject("Outlook.Application"); 
    var nameSpace = myOlApp.GetNameSpace("MAPI"); 
    var recipient = nameSpace.CreateRecipient("[email protected]"); 
    var cFolder = nameSpace.GetSharedDefaultFolder(recipient,9); 

    var appointment = cFolder.Items.Add(1); 
    appointment.Subject = "Subject"; 
    appointment.Location = "Location"; 
    appointment.Start = "22.02.2017 17:00"; 
    appointment.Duration = "120"; 
    appointment.Categories = "deleteme"; 
    appointment.Body = "bla"; 

    var va = new VBArray(appointment.RTFBody).toArray(); 
    var bla = String.fromCharCode.apply(null, va); 
    document.forms[0].output.value = bla; 
    // var bla2 = windows1252.decode(bla); 

    appointment.RTFBody = dict.Items(); 
    appointment.ReminderSet = "true"; 
    appointment.Save(); 
    entryId = appointment.EntryId; 
    appointment.Display(); 

    delete appointment; 
    delete cFolder; 
    delete recipient; 
    delete nameSpace; 
    delete myOlApp; 
} 
    </script> 
    <body> 
     <form> 
      <input type="button" onclick="doit2()" value="doit"/> 
      <textarea name="output" rows="5" cols="50"></textarea> 
     </form> 
    </body> 
</html> 
+0

Quelques autres liens similaires sur cette rubrique: [problème SO] (http://stackoverflow.com/questions/36086331) et l'entrée [MSDN forum entry] référencée (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/5dba0d12 -94e8-47a5-b082-93d3693e2a47) – kiwiwings

Répondre

1

Il y a un problème connu avec la propriété MailItem.RtfBody étant définie à l'aide la liaison tardive (c'est-ce que JS utilise - IDispatch.GetIDsOfNames/Invoke). L'anticipation (appel à travers la v-table) fonctionne bien.

La dernière fois que j'ai entendu parler de cela, il n'y avait pas de solutions de contournement, du moins pas lorsque vous utilisez JS. Vous pouvez essayer d'utiliser Redemption (il expose la propriété RtfBody sur ses objets Safe * Item et son objet RDOMail), mais vous devrez alors l'installer sur chaque machine sur laquelle votre script s'exécutera.

+0

Merci de m'avoir fait remarquer - pendant que je cherchais une solution, je suis tombé sur une explication contraignante, mais je ne l'ai pas comprise. Maintenant, avec les nouvelles expressions de recherche, j'ai trouvé [votre message] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/3c02ffe9-7375-4fed-804f-514820b6fe57) - malheureusement fournir Redemption n'est pas une option ici. Peut-être que le MAPI étendu mentionné est de toute aide ... mais je vais probablement laisser le contenu non formaté ... – kiwiwings

+0

... comme vous le dites dans votre [site] (http://www.dimastr.com/redemption/ home.htm) ... "Redemption utilise MAPI étendu (qui n'est pas affecté par le correctif de sécurité car il n'est pas accessible aux langages de script)" :( – kiwiwings

+0

Oui, JS ne peut pas faire de MAPI étendu. Même C# ne peut pas l'utiliser (at moins facilement), –