2017-02-24 11 views
0

私はRTFフォーマットされたカレンダーエントリを設定したいのですが、ActiveXオブジェクト、すなわちRTFBodyプロパティに[]バイトを渡す方法がわかりません。一部のコンテンツが設定された後ActiveXコンポーネントのbyte []プロパティをJavascriptから設定するにはどうすればよいですか?

次のコードは、RTFBodyプロパティを読み込む - ので、[]バイトを読んで作業しているが、私は戻って、まったく同じ内容(0末尾+)を書いてみる、U/Int8ArrayScripting.Directoryでもありません働く

多分それはいくつかの.NET objectsを回避することは可能ですが、私はそれらの非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)遅延バインディングを使用して設定されているとの既知の問題があります。早期のbiding(v-tableを呼び出す)はうまく動作します。私はこの話を聞いた

前回は、少なくともあなたはJSを使用しているいないとき、何の回避策はありませんでした。 Redemption(Safe * ItemオブジェクトとRDOMailオブジェクトのRtfBodyプロパティを公開する)を使用することができますが、スクリプトが実行されるすべてのマシンにインストールする必要があります。

+0

これを指摘してくれてありがとう - 解決策を探しているうちに、私はバインディングの説明で来ましたが、理解できませんでした。今度は新しい検索式を使用して、私は[あなたの投稿](https://social.msdn.microsoft.com/Forums/vstudio/en-US/3c02ffe9-7375-4fed-804f-514820b6fe57)を見つけました。残念ながら、ここではオプションではありません。たぶん言及された拡張されたMAPIはどんな助けでもあります...しかし、おそらく私はちょうどコンテンツをフォーマットされていないままにします... – kiwiwings

+0

... [サイト](http://www.dimastr.com/redemption/) home.htm)...「償還は、それがスクリプト言語にアクセスできないため、セキュリティパッチの影響を受けていない拡張MAPI()を使用しています」:( – kiwiwings

+0

はい、JSは、Extended MAPIを行うことはできません。でも、C#が(でそれを使用することはできません少なくとも容易ではない) –

関連する問題