小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Windows Script Componentのレジストリ登録時に「適切な名前を指定してください。」というエラーが出る件とその対処法

Windows Script Component(以下、WSC)のレジストリ登録時に「適切な名前を指定してください。」というエラーが出る場合というのは、結論から言いますと、XMLの文法に正しく従っていない可能性があります。色々パターンはあると思いますが、自分が陥ったパターンについて書きます。
たとえば、以下のような現在時刻を返すメソッドだけを用意したWSCがあると仮定します。

XML宣言がないWSC
<package>
  <component id="Hoge">
    <registration progid="Hoge.Timer" />
    
    <public>
      <method name="GetTime" />
    </public>
    
    <script language="VBScript">
      ' << 現在時刻を返す
      Function GetTime()
        GetTime = Now
      End Function
    </script>
  </component>
</package>

このWSCにはXML宣言がありませんが、レジストリ登録は成功し、GetTimeメソッドも問題なく呼び出すことができます。WSCはXML形式として書くことが一般的ですが、実はXML宣言がなくても動作します。次に、このWSCにXML宣言を付加してみます。

XML宣言のあるWSC
<?xml version="1.0" encoding="UTF-8" ?>
<package>
  <component id="Hoge">
    <registration progid="Hoge.Timer" />
    
    <public>
      <method name="GetTime" />
    </public>
    
    <script language="VBScript">
      ' << 現在時刻を返す ← ここがポイント
      Function GetTime()
        GetTime = Now
      End Function
    </script>
  </component>
</package>

XML宣言を付加しただけですが、このWSCをレジストリ登録しようとした場合、「適切な名前を指定してください。」というエラーが発生します。

原因

エラーの原因は、XML中に使用できない文字が含まれていたという単純な文法エラーです。
ここがポイントの部分にある「<」という記号は、XMLではタグの開始を表す特殊な記号であり、直接記述してはいけないことになっています。たとえ、コメント行であろうとこれは変わりません。
XML宣言がない場合は、XML文書とみなされないため、この問題は露呈しません。ですが、XML宣言を付加した途端、XML文書としての文法チェックが行われ、この場合には動かないコンポーネントになってしまいます。
僕がハマった事例は、コメント行では、なく単純なif文で文法エラーになっていました。数値を比較する際のif < aという比較記号が使用できない文字に該当していました。

対処方法

対処方法は、通常のXMLと同じで、CDATAセクションとして記号を記述します。

<?xml version="1.0" encoding="UTF-8" ?>
<package>
  <component id="Hoge">
    <registration progid="Hoge.Timer" />
    
    <public>
      <method name="GetTime" />
    </public>
    
    <script language="VBScript">
    <![CDATA[
      ' << 現在時刻を返す ← ここがポイント
      Function GetTime()
        GetTime = Now
      End Function
    ]]>
    </script>
  </component>
</package>