2017-02-24 76 views
0

我想設置RTF格式的日曆條目,但不知道如何將字節[]傳遞給ActiveX對象,即RTFBody屬性。如何從Javascript設置ActiveX組件的byte []屬性?

下面的代碼讀取RTFBody屬性後,一些內容已定 - 所以讀完的byte []的工作,但是當我試圖準確地寫相同的內容(+尾隨0)回來了,既不是U/Int8Array也不是Scripting.Directory作品。

也許有可能解決一些.NET objects,但我不知道如何instanciate這些非ActiveX組件。另一種解決方案不需要腳本化格式,例如「轉到第2行並將其設爲粗體」,即我喜歡通過模板生成rtf,並僅將結果粘貼到日曆對象中。

我知道這必須最終編碼在Windows-1252,但一開始我只想看到相同的字節寫入成功。該腳本在HTA上下文中執行 - 因此腳本安全性不是問題。

<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

多幾個類似的鏈接本主題:[SO問題](http://stackoverflow.com/questions/36086331)和引用的[MSDN論壇條目](https://social.msdn.microsoft.com/Forums/sqlserver/en-US/5dba0d12 -94e8-47a5-b082-93d3693e2a47) – kiwiwings

回答

1

有一個已知問題MailItem.RtfBody財產使用後期綁定被設置(這就是JS使用 - IDispatch.GetIDsOfNames/Invoke)。早期投標(通過v表調用)工作正常。

上次我聽說這個,沒有解決方法,至少在你使用JS時沒有。你可以嘗試使用Redemption(它暴露了它的安全*項目對象和RDOMail對象RtfBody屬性),但隨後你需要進入你的腳本將運行的每臺機器上安裝它..

+0

感謝您指出這一點 - 在尋找解決方案時,我通過一個綁定解釋來解決問題,但並不理解它。現在使用新的搜索表達式,我發現[您的帖子](https://social.msdn.microsoft.com/Forums/vstudio/en-US/3c02ffe9-7375-4fed-804f-514820b6fe57) - 遺憾地提供了Redemption在這裏不是一個選項。也許提到的擴展MAPI有任何幫助...但可能我會留下未格式化的內容... – kiwiwings

+0

...正如你在[網站](http://www.dimastr.com/redemption/ home.htm)...「贖回使用擴展MAPI(不受安全修補程序影響,因爲腳本語言無法訪問)」:(:) – kiwiwings

+0

是的,JS無法執行擴展MAPI,即使C#也無法使用它(在至少不容易), –