COMサーバー (2)

ようやくJavaScriptVBScript のエンジンで動くようになった。
 
けど、まだ良くわかっていないので「真似」で動いている気もする。
IActiveScriptSite をちゃんとやって動くようになった。IClassFactory も。
それで作ったDLLを regsvr32 で登録。
うん、うん、成功している。
という事でhtmlに
<html>
<head>
<title>サンプル</title>
</head>
<body>
<script type="text/javascript">
<!--
ここにスクリプトを書いてやる。
// -->
</script>
</body>
</html>
当然だが var obj = new ActiveXObject("MayComLib.MayComSrv");  
のようにActiveXObjectを生成してやる。
 
やっぱり、駄目だった(泣)。
イメージ 1

こんなのが出てしまう。
しかし、調べてみると私のバグでは無く実装されていないセキュリティー関連の問題と判明。

つまり、IObjectSafetyの継承が必要なようだ。
なので#include "Objsafe.h" として GetInterfaceSafetyOptions と SetInterfaceSafetyOptions
をちゃんと実装してやれば良いみたい。
でも、どうやって良いのか分からない。
しかし、この辺りは一応定番で良さそうと分かった。つまり、
 
   STDMETHODIMP GetInterfaceSafetyOptions( REFIID riid,
      DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
   {
    *pdwSupportedOptions = 0;
    *pdwEnabledOptions = 0;
    *pdwSupportedOptions = *pdwEnabledOptions |=
    (INTERFACESAFE_FOR_UNTRUSTED_CALLER |
    INTERFACESAFE_FOR_UNTRUSTED_DATA |
    INTERFACE_USES_DISPEX |
    INTERFACE_USES_SECURITY_MANAGER );
    return S_OK;
   }
   STDMETHODIMP SetInterfaceSafetyOptions( REFIID riid, DWORD dwOptionSetMask,
      DWORD dwEnabledOptions)
   {
    if (dwOptionSetMask & (dwOptionSetMask ^ (INTERFACESAFE_FOR_UNTRUSTED_CALLER
    | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_DISPEX |
    INTERFACE_USES_SECURITY_MANAGER ) ))
    return E_FAIL;
    return S_OK;
   }
でお茶を濁せる(みたい)。あとはちゃんと繋げてやる。(QueryInterfaceへの追記)
if (riid == IID_IObjectSafety){
 *ppvObj = static_cast<IObjectSafety*>(this);
 this->AddRef();
 return S_OK;
}
 
そうやってDLLを作ってみると「おーー!!」ちゃんと動いている!!。
でも少し怪しい。と言うのもメモリーリークがありそう。
どうもAddRef()とRelease()、、、みたいだ。