Life Goes On

締め切りが近い仕事があるのに、今日、月イチの通院日で、パスしようかと思ったんですが・・・薬切れかけで不安なので雨の中午前中某病院へ。いつもは最低30分は待たされるんですが、今日は診察券出して2~3分で名前をコール。今日はラッキーでした(^^

で、これです。リマスタリング版!

The Beatles 新ボックスセット

The Beatles 新ボックスセット

と、いっても、コレ、僕のものじゃなくて・・・(^^;;; Amazonで買おうかどうか迷っているって話してたら、「もう買ったよ」という上司がいて、「貸したるわ」ってなことで、借りました(^^

これは、リマスタリングしたとのことですが・・・ショボイ、オーディオ機器ではやっぱり違いがわかりません(笑) しかし、このボックスセットは、欲しくなりました。古き良き?レコードを思いださせるような、CDレーベル面とか装丁とか、なかなか。

早速アマゾンで予約しよ。

残り5GB

昨日撮った画像データをHDDに転送したら、500GBのHDDの残りがたったの5GBに・・・。警告が出るまで気付かなかった(^^;;;

で、夕方に急遽神戸に・・・いったけど、欲しいものがなくて、結局大阪のヨドバシまで脚を伸ばしました。分かってれば昨日出たついでに買ったんだけどね・・・

どんどん外付けのハードディスクが増えていくな・・・。

昨日のん、もう一枚上げときます。カビ防止のため?かなりひさしぶりに70-300Gをもちだして、強引に使ってきました(^^;

新井涼子さん

新井涼子さん

サクサク軽快~!

「サクサク軽快~!パソコン操作も、サクサク軽快~ ○○○を選んだあなたは大正解~♪」

という、とあるセキュリティ対策ソフトウェアのCMが気になってしょうがないです(^^;;; そろそろなんか、セキュリティソフトを入れないといけないんだけど・・・。

どうでもいいんだけど・・・、昔、とある電器屋のソフト売り場で、ウイルス対策ソフトのことを、なんども「このウイルスソフトは検出率が高くて・・・~」と言って商品説明してた、店頭販売のお姉さんがいて、「え?」と苦笑した覚えがあります・・・。

で、

先日から、会社の何年かに一度の莫大な予算(といっても大企業に比べるとささやかなもんだけど・・・)をかけた、催し物みたいなものの、告知ページ(ホームページの)の作成をしているんですが・・・それより気がかりなのが、打ち合わせのときに何気に見せてもらった人員配置表みたいな用紙に、僕の名前が・・・「会場カメラマン」・・・って・・・(笑)  カメコ病でコンパニオンのお姉さんばっかり写してたりしてたら、さすがに怒られる・・・というか、次の日から、白い目でみられますね(^^;;;

かなり有名な人(スポーツ系)が講演にくる予定(まだ分かんないけど)なので、ちょっと楽しみです。

今年の夏も終わったね

朝晩が涼しくなってきました。今年はエルニーニョのせいか、日本特有のジメジメした暑さが少なかったような・・・?今年の「海の家」は繁盛してたんでしょうか?

そういえば、今年は、浴衣美女を撮ってないなぁ~、とちと後悔しつつ、「さよなら夏の日」を聴きながら作業してます(^^;;;

去年のさあやちゃん。

去年のさあやちゃん。

全然関係ないんですが・・・、先週、三ヶ月ぶりに髪を思いきっり短く刈って、いや、まぁ、毎回そうなんですけど、普段あまり表情が良くなくて短く刈ると余計いかつく見えるらしく、雑踏なんかでちらしとかティッシュ配りの人が避けてくれるんですよね(^^;;; 「受け取らないぞ」オーラが出てんでしょうか。いや、実際うざいので受け取りたくないんだが・・・。

「愛想の良さそうな顔(表情)」を自然にできる人がうらやましい。なんのこっちゃ。

COMサーバーにJScriptのイベントハンドラを登録する 修正版

COMサーバーにJScriptのイベントハンドラを登録する の「修正版」です。

前回の例には、致命的なエラーが起こる場合があります。onCurrent というプロパティーに関数オブジェクトを設定し、取得することができます。しかし、まだonCurrentプロパティに関数オブジェクトを設定しない、未設定の場合、onCurrent を参照すると、スクリプト側にエラー値を戻すとので、エラーがスローされ実行が止まってしまいます。

つまり、

var obj = new ActiveXObject("MyServer.Utility");
WScript.Echo(obj.onCurrent);

とすると、エラーで止まってしまいます。まだプロパティが未設定ならば、nullを返すようにすれば万事OKです(^^;

というわけで、修正です。

まず、onCurrentのプロパティの設定と取得でのデータ受け渡しを、IDispatch* ではなく、VARIANT にします。関数オブジェクトは、このVARIANTで、vtメンバをVT_DISPATCHにして受け渡すことになります。

ところどころ修正したものが次のとおり。

/*
 compiler command line :
   cl /LD MyServer.cpp /link /TLBOUT:MyServer.tlb
*/

#pragma comment(lib,"comsuppw.lib")

#define STRICT
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#define _ATL_ATTRIBUTES
#define _ATL_APARTMENT_THREADED
#define _ATL_NO_AUTOMATIC_NAMESPACE
#include <atlbase.h>
#include <atlcom.h>
#include <atlwin.h>
#include <atltypes.h>
#include <atlctl.h>
#include <atlhost.h>
using namespace ATL;

#include <comutil.h>

//マクロ定義
#define PPVOID(X) (reinterpret_cast<LPVOID*>(X))
#define QI(X,Y,Z) ((X)->QueryInterface((Y),(reinterpret_cast<LPVOID*>(Z))))
#define RELEASE(X) {if(X){(X)->Release(); X=NULL;}}

// DllMain,DllCanUnloadNow,DllRegisterServer and DllUnregisterServer
[ module(dll, name = "MyServer", helpstring = "MyServer 1.0 Type Library") ];
[ emitidl ];

/////////////////////////////////////////////////////////////////////////////
// インターフェイス定義  :   IMyServer 
[
   object,
   dual,
   oleautomation,
   helpstring("IMyServer Interface"),
   pointer_default(unique)
]
__interface IMyServer : IDispatch
{
  [id(1)] HRESULT CurrentDirectory([out,retval]BSTR *sPath);

  [id(2),propput] HRESULT onCurrent([in] VARIANTARG var);
  [id(2),propget] HRESULT onCurrent([out,retval] VARIANTARG *pvar);

};

/////////////////////////////////////////////////////////////////////////////
// イベントインターフェイス定義 : IMyServerEvent
[
  dispinterface,
  hidden,
  helpstring("IMyServerEvents Interface")
]
__interface IMyServerEvent
{
  [id(1)] HRESULT onCurrent();
};

/////////////////////////////////////////////////////////////////////////////
// インターフェイス実装  : CMyServer
[
   coclass,
   threading(apartment),
   source(IMyServerEvent),
   event_source(com),
   vi_progid("MyServer.Utility"),
   progid("MyServer.Utility.1"),
   version(1.0),
   helpstring("MyServer Class")
]
class ATL_NO_VTABLE CMyServer :
   public IMyServer
{
public:
   CMyServer()
     {

     }

  __event __interface IMyServerEvent;

  DECLARE_PROTECT_FINAL_CONSTRUCT()
  HRESULT FinalConstruct()
    {
      m_pDispatch = NULL;
      return S_OK;
    }

  void FinalRelease()
    {
      RELEASE(m_pDispatch);
      return;
    }

  HRESULT CurrentDirectory(BSTR *sPath)
    {
      TCHAR pBuffer[MAX_PATH+1] = {0};
      ::GetCurrentDirectory(MAX_PATH+1,pBuffer);

      *sPath = _bstr_t(pBuffer).Detach();

      Fire();
      return S_OK;
    }

  // スクリプトから渡されるオブジェクトの設定と取得
  HRESULT put_onCurrent(VARIANTARG var)
    {
      HRESULT hRes = E_INVALIDARG;
      LPDISPATCH pDispatchNew = NULL;

      if(var.vt == VT_DISPATCH)
        {
          if(SUCCEEDED(hRes = QI(var.pdispVal,IID_IDispatch,&pDispatchNew)))
            {
              /*if(m_pDispatch)
                m_pDispatch->Release();*/
              RELEASE(m_pDispatch);

              m_pDispatch = pDispatchNew;
            }
        }
      else
        hRes = E_INVALIDARG;

      return hRes;
    }

  //関数オブジェクトの取得
  HRESULT get_onCurrent(VARIANTARG *pvar)
    {
      HRESULT hRes = S_OK;
      IDispatch *pDisp = NULL;
      if(m_pDispatch)
        {
          if(SUCCEEDED(hRes = QI(m_pDispatch,IID_IDispatch,&pDisp)))
            {
              VariantClear(pvar);
              pvar->vt = VT_DISPATCH;
              pvar->pdispVal = pDisp;
            }
        }
      else
        {
          //もし保持している関数オブジェクトがなければ空に。
          VariantClear(pvar);
        }

      return hRes;
    }

private:

  LPDISPATCH m_pDispatch;

  void Fire()
    {
      DISPPARAMS dispparams = {NULL,NULL,0,0};

      //COMイベント発火
      IMyServerEvent_onCurrent();

      //設定された関数オブジェクトを実行,デフォルト
      if(m_pDispatch)
        m_pDispatch->Invoke((DISPID)DISPID_VALUE,
                            IID_NULL,
                            LOCALE_USER_DEFAULT,
                            DISPATCH_METHOD,
                            &dispparams,
                            NULL,
                            NULL,
                            NULL);
    }
};

VARIANT型とIDispatchインターフェイスは、C++とJScriptとでデータを受け渡しする上で必ず付いてまわるのですが、あまりこのあたりを詳しく解説してある本を見つけることができないのがネックです。

この件の備忘録終了。