COMサーバー (2)
ようやくJavaScript、VBScript のエンジンで動くようになった。
けど、まだ良くわかっていないので「真似」で動いている気もする。
IActiveScriptSite をちゃんとやって動くようになった。IClassFactory も。
それで作ったDLLを regsvr32 で登録。
うん、うん、成功している。
うん、うん、成功している。
という事でhtmlに
<html>
<head>
<title>サンプル</title>
</head>
<body>
<script type="text/javascript">
<!--
ここにスクリプトを書いてやる。
// -->
</script>
</body>
</html>
<head>
<title>サンプル</title>
</head>
<body>
<script type="text/javascript">
<!--
ここにスクリプトを書いてやる。
// -->
</script>
</body>
</html>
当然だが var obj = new ActiveXObject("MayComLib.MayComSrv");
のようにActiveXObjectを生成してやる。
やっぱり、駄目だった(泣)。
こんなのが出てしまう。
しかし、調べてみると私のバグでは無く実装されていないセキュリティー関連の問題と判明。
つまり、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;
}
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;
}
if (riid == IID_IObjectSafety){
*ppvObj = static_cast<IObjectSafety*>(this);
this->AddRef();
return S_OK;
}
そうやってDLLを作ってみると「おーー!!」ちゃんと動いている!!。
でも少し怪しい。と言うのもメモリーリークがありそう。
どうもAddRef()とRelease()、、、みたいだ。