|
h-tom です。
秀丸エディタ:Ver.8.00
OS:Windows VistaSP2(32bit)
Unicodeを含む設定を保存するのに、XMLを使おうと思い、"MSXML2"を
COM経由で、使用しましたが、うまく動きません。
オブジェクト(?)を引数にしている箇所で、エラーとなります。
(callmethod → member に変えてみましたがエラーになります。)
これは、対応可能でしょうか?
(COM関連は、型が異様に多いみたいですが)
・実行したマクロ
・実行結果
・同じ処理を行うVBS
を、添付します。
"D:\temp"に、XMLファイルを書き出します。
// マクロ ここから
debuginfo 1;
#reader = createobject("MSXML2.SAXXMLReader");
#writer = createobject("MSXML2.MXXMLWriter");
#xmldoc = createobject("MSXML2.DOMDocument");
#xmlout = createobject("MSXML2.DOMDocument");
setpropnum #xmldoc, "preserveWhiteSpace", 1;
setpropnum #writer, "indent", 1;
setpropnum #writer, "standalone", 1;
setpropstr #writer, "Encoding", "UTF-8";
setpropobj #reader, "contentHandler",#writer;
callmethod #reader, "putProperty", "http://xml.org/sax/properties/lexical-ha
ndler",#writer;
call DBCOM "0";
#head = callmethod_returnobj(#xmldoc, "createProcessingInstruction","xml", "
version='1.0' encoding='UTF-8'");
call DBCOM "1";
callmethod #xmldoc, "appendChild", #head;
call DBCOM "2";
//root作成
#root= callmethod_returnobj(#xmldoc, "createElement", "root");
call DBCOM "3";
callmethod #xmldoc, "appendChild", #root;
call DBCOM "4";
//sctionノード作成
#section = callmethod_returnobj(#xmldoc, "createElement", "sction");
call DBCOM "5";
//key1ノード作成
#key1= callmethod_returnobj(#xmldoc, "createElement", "key1");
call DBCOM "6";
//key1ノードにテキスト追加
#addname = callmethod_returnobj(#xmldoc, "createTextNode", "設定1");
call DBCOM "7";
callmethod #key1, "appendChild", #addname;
call DBCOM "8";
//key2ノード作成
#key2 = callmethod_returnobj(#xmldoc, "createElement", "key2");
call DBCOM "9";
//key2ノードにテキスト追加
#addyear = callmethod_returnobj(#xmldoc, "createTextNode", "設定2");
call DBCOM "10";
callmethod #key2, "appendChild", #addyear;
call DBCOM "11";
//sectionにkey1,key2を追加
callmethod #section, "appendChild", #key1;
call DBCOM "12";
callmethod #section, "appendChild", #key2;
call DBCOM "13";
//rootにsectionを追加
callmethod #root, "appendChild", #section;
call DBCOM "14";
callmethod #xmldoc, "save", "D:\\temp\\test_mac.xml";
call DBCOM "15";
$xml = getpropstr(#xmldoc,"xml");
call DBCOM "16";
callmethod #reader, "Parse", $xml;
call DBCOM "17";
#out1 = getpropobj(#writer, "output");
call DBCOM "18";
callmethod #xmlout, "loadXML", #out1;
call DBCOM "19";
callmethod #xmlout, "save", "D:\\temp\\test_mac2.xml";
call DBCOM "20";
endmacro;
DBCOM:
debuginfo rightstr("00" + $$1, 3) + ":result=" + str(getresultex(1
0)) + ":0x" +
rightstr("0000000000" + hex(getresultex(11)), 8) + "\n";
return;
// マクロ ここまで
// 出力結果 ここから
80070057 E_INVALIDARG プロシージャの呼び出し、または引数が不正です。
80020005 DISP_E_TYPEMISMATCH 型が一致しません。
No.:Result :HRESULT
-----------------------
000:result=0:0x80070057
001:result=1:0x00000000
002:result=0:0x80020005
003:result=1:0x00000000
004:result=0:0x80020005
005:result=1:0x00000000
006:result=1:0x00000000
007:result=1:0x00000000
008:result=0:0x80020005
009:result=1:0x00000000
010:result=1:0x00000000
011:result=0:0x80020005
012:result=0:0x80020005
013:result=0:0x80020005
014:result=0:0x80020005
015:result=1:0x00000000
016:result=1:0x00000000
017:result=0:0xC00CE558
018:result=0:0x00000000
019:result=1:0x00000000
020:result=1:0x00000000
// 出力結果 ここまで
// ここから 同じ処理をしているVBS
set reader = createObject("MSXML2.SAXXMLReader")
set writer = createObject("MSXML2.MXXMLWriter")
set xmldoc = createObject("MSXML2.DOMDocument")
set xmlout = createObject("MSXML2.DOMDocument")
xmldoc.preserveWhiteSpace = True
writer.indent = True
writer.standalone = True
writer.Encoding = "UTF-8"
set reader.contentHandler = writer
call reader.putProperty("http://xml.org/sax/properties/lexical-handler", wri
ter)
set head = xmldoc.createProcessingInstruction("xml", "version='1.0' encoding
='UTF-8'")
xmldoc.appendChild(head)
'ルート作成
set root = xmldoc.createElement("root")
xmldoc.appendChild(root)
'sectionノード作成
set section = xmldoc.createElement("sction")
'key1ノード作成
set key1 = xmldoc.createElement("key1")
'key1ノードにテキスト追加
key1.appendChild(xmldoc.createTextNode("設定1"))
'key2ノード作成
set key2 = xmldoc.createElement("key2")
'key2ノードにテキスト追加
key2.appendChild(xmldoc.createTextNode("設定2"))
'sectionにkey1とkey2を追加
section.appendChild(key1)
section.appendChild(key2)
'rootにsectionを追加
root.appendChild(section)
'保存
xmldoc.save("D:\temp\test.xml")
'インテントで整形して保存
reader.Parse xmldoc.xml
xmlout.loadXML(writer.output)
xmlout.save("D:\temp\test2.xml")
// ここまで 同じ処理をしているVBS
|
|