Internet Explorer 9 以降では、ActiveX コントロール メソッドの戻り値 S_FALSE をエラーと判断します。

適用対象: Internet Explorer 9Internet Explorer 10Internet Explorer 11

現象


HTML コンテンツ上で動作する ActiveX コントロールのメソッド呼び出しの結果 S_FALSE が返された場合、以下のようなスクリプト エラーが発生します。

SCRIPT16389: ファンクションが間違っています。

この現象は、以下の条件をすべて満たす場合に発生します。
  • バージョン 9 以降の Internet Explorer を使用している。
  • "IE9 標準" 以降のドキュメント モードで HTML コンテンツが表示されている。
  • object タグで ActiveX コントロールを使用している。

原因


HTML コンテンツ上で動作する ActiveX コントロールのメソッドをスクリプトから実行する時、ActiveX コントロール メソッドは ActiveX コントロール側が実装する IDispatch::Invoke メソッドを通じて実行されます。また IDispatch::Invoke メソッドでは、戻り値 (HRESULT 値) として "成功" を示す値は S_OK のみと定義されています。
バージョン 8 以前の Internet Explorer では、ActiveX コントロール メソッドの戻り値が S_FALSE であっても、特にエラーとして処理は行いません。
一方、バージョン 9 以降の Internet Explorer では、ActiveX コントロール メソッドの戻り値を IDispatch::Invoke の定義に則って厳密に判断し、戻り値が S_OK 以外の場合はエラーとして処理するよう動作が変更されています。

なお、この動作変更は、ActiveX コントロール オブジェクトが HTML 要素の一部として動作する場合に適用されます。つまり、object タグでホストされる ActiveX コントロール オブジェクトに対してはこの動作変更が適用されますが、JScript の ActiveXObject メソッドや VBScript の CreateObject メソッドでインスタンス化された HTML 要素に属さないオートメーション オブジェクトに対してはこの動作変更は適用されません。

またこの動作変更は、互換性の観点から "IE9 標準" 以降のドキュメント モードにのみ追加されています。

解決方法


ActiveX コントロールのメソッドにおいて、S_FALSE ではなく S_OK を返すように実装を変更します。

状況


この動作は仕様です。

詳細


以下のように ActiveX コントロールを使用する場合に、現象が発生します。

<!-- ActiveX コントロールを以下のように object タグでホストします。--> <object id="AxObj" classid="clsid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"></object> <!-- ActiveX コントロール メソッドを以下のように呼び出します。--> <script type="text/javascript"> function CallActiveXMethod() { var obj = document.getElementById("AxObj"); obj.MyMethod(); } </script>

一方、 以下のように ActiveX コントロールを使用する場合には、現象は発生しません。
<!-- ActiveX コントロール メソッドを以下のように呼び出します。--> <script type="text/javascript"> function CallActiveXMethod() { var obj = new ActiveXObject("MyActiveX.Control"); obj.MyMethod(); } </script>


関連情報


IDispatch::Invoke メソッドの定義は、以下の MSDN リファレンス (英語) を参照ください。

IDispatch::Invoke method (Automation)