2017-02-24 2 views
0

RTF 형식의 캘린더 항목을 설정하고 싶지만 byte []를 ActiveX 객체 (예 : RTFBody 속성)로 전달하는 방법을 모르겠습니다.Javascript에서 ActiveX 구성 요소의 byte [] 속성을 설정하는 방법은 무엇입니까?

다음 코드는 일부 콘텐츠가 설정 한 후 RTFBody 속성을 읽지 않습니다 - 그래서 바이트 [] 작동하고 읽기,하지만 난 정확히 동일한 콘텐츠를 작성하려고 할 때 (0 후행 +) 다시, 어느 쪽도 U/Int8Array도 아니고 Scripting.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 issue] (http://stackoverflow.com/questions/36086331) 및 참조 된 [MSDN 포럼 항목] (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/5dba0d12 -94e8-47a5-b082-93d3693e2a47) – kiwiwings

답변

1

늦은 결합하여 설정되는 속성 MailItem.RtfBody 알려진 문제 (- IDispatch.GetIDsOfNames/Invoke 즉 JS 사용하는 무엇)이있다. 조기 biding (v-table을 통한 호출)은 잘 작동합니다.

지난 번 내가 들었을 때, 적어도 JS를 사용하는 경우에는 해결 방법이 없었습니다. Redemption (Safe * Item 객체 및 RDOMail 객체에 RtfBody 속성을 표시 함)을 사용할 수 있지만 스크립트가 실행될 모든 컴퓨터에 설치해야합니다.

+0

해결책을 찾으면서 바인딩 설명을 들었지만 이해하지 못했습니다. 이제 새로운 검색 표현을 통해 [귀하의 게시물] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/3c02ffe9-7375-4fed-804f-514820b6fe57)을 발견했습니다 - 불행히도 Redemption 여기에는 옵션이 없습니다. 어쩌면 언급 한 확장 MAPI는 어떤 도움이 될지 모르겠지만 ... 아마도 나는 내용을 포맷하지 않은 채로 남겨 둘 것입니다 ... – kiwiwings

+0

... [site] (http://www.dimastr.com/redemption/)에서 말한대로 ... home.htm) ... "사용시 확장 된 MAPI (스크립팅 언어에서 액세스 할 수 없으므로 보안 패치의 영향을받지 않음)를 사용합니다."( – kiwiwings

+0

예, JS에서 확장 MAPI를 수행 할 수 없으며 C#에서도 사용할 수 없습니다. 적어도 쉽게) –

관련 문제