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>
몇 가지 유사한 링크가 있습니다. 이 항목 : [SO issue] (http://stackoverflow.com/questions/36086331) 및 참조 된 [MSDN 포럼 항목] (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/5dba0d12 -94e8-47a5-b082-93d3693e2a47) – kiwiwings