64bit化、断念

しそうです(ーー;

環境を64bit化するにあたってネット上でいろいろ情報を検索しまくった結果、64bitで得られるメリットがあまりに少なく・・・たしかにPhotoshopでレタッチするときなんかだとメリットもあるのですが、画像処理のためだけのパソコンじゃないので・・・。あえてイバラの道を突き進むこともなかろう・・・どうしよっかなぁ~と迷っている最中です。

メモリの値段がちょっと高すぎるのも一つの要因ですが・・・(^^;

で、欲しい中古のDVD(ソフト)も探したかったので、久しぶりに、でんでんタウン~ヨドバシを回ってきました。しかし、今日は暑かった。

ST3500418as

Hitachi の500GBプラッタのを買おうかと思ってたんですが、あいにく入った店では売り切れで、Seagateのものに・・・。ま、もうちょっと回れば良かったんですが、さんざん歩いて体力なし(--;

世間では飛び石連休(連休じゃないな・・・)ですが、僕は月曜休みで連休なので・・・、日曜か月曜くらいにOSの入れ替えやろうかと思ってます。

ちょっと考え直して・・・修正しました。

32bitから64bitへのアップグレード

着々とWindows7へのアップグレードのため前準備をしている最中です。Adobeアプリのライセンスの転送やら、ツール類の設定バックアップやら、サーバー類の設定のバックアップやら・・・・とにかく、アップグレードするより、今の環境をいかに容易に引き継げるかに最大のエネルギーを注いでます(^^;;;

で、XPでのマイドキュメントやらデスクトップに大量にあるファイルを一気にバックアップしようと、7のDVD-ROMに入っているWindows転送ツールを使おうとしたんですが・・・ちょいと???なことが・・・。

僕は、Windows7の64bitにアップグレードしようと思っていたので、何も考えず、64ビット版のディスクをDVDドライブに入れて転送ツールを起動しようとしました。。。が、「互換性がありません」とかなんとかのエラーダイアログ。ん?もしかして、64bit版のディスクは全て64bitバイナリが入ってんの??? 予想通り、ルートにあるセットアッププログラムも64bitバイナリみたい・・・。

?じゃぁ、WindowsXP(32bit)が起動している状態で、64bit版のディスクからアップグレードできないんじゃ???

いや、そんなはずない、ちゃんと、XP(32bit)からWindows7(64bit)へのアップグレードはカスタムインストールで可能。と同梱の説明書のリーフレットにも書いてあった。

でも、アップグレードは、アップグレード対象のOSが起動している状態からでないとプロダクトキーが受け付けないはず・・・。MSのサイトでドキュメントを探しまくっても、XP(32bit)から7(64bit)のアップグレード方法の詳細を記述しているページが見つからん・・・。

それって、32bit → 64bit のアップグレードは非推奨ってこと???

で、ネットで検索するとやっぱり同じ疑問にぶち当たっている方もいるようで・・・、結論としては・・・、

XP(32bit)から7(64bit)のアップグレードは、64bit版のディスクから直接立ち上げてからカスタム(新規)インストールしないといけないみたいです。当然だけど、アップグレード対象のOSが稼働しているHDDを接続しておかないといけないけど・・・。

ということは、新しいHDD買ってきて接続してそこへクリーンインストールできるっちゅーことですかね。新しいHDDにわざわざリカバリをかけなくてもいいんだったら手間が一個省けます。

なんか、もしインストールが途中で失敗したら、すげーメンドクサイ状態になりそうな予感が・・・

週末HDDとメモリ買いに久しぶりに、でんでんタウンまで出かけてみようかな。

Which is better?

予約していたWindows7 今日届いてました。

っていう、ブログのエントリ多そうですね(^^;;;

前にみたいに、インストール中にアップグレード対象のOSのメディアを突っ込む方式は、今は採用されていなくて、アップグレード版のインストールは必ず元のOSからでないとインストールできないので、インストールメディアは届いたものの、インストール先のストレージをどうしようかと迷っています。

新規にHDDかSSDを買ってそこへインストールするとなると、一旦PCのリカバリディスクでXPを復元しておいてそこからアップグレードするしか方法はないんだけど、2倍手間がかかるし。

今使っているHDDはアクセス音がやたらガリガリうるさいのでできるだけ交換したいんだけど・・・。なやみどこです。

それと、32bit か 64bit どっちインストールするか。64bitならメモリスロットを埋めて、どうせなら計8GBで運用したい。実際8GBなんて使い切るケースなんてまず無いんですけどね・・・要はキモチの(精神衛生上の)問題です「64bitで8GBだぁ~、メモリの空き容量が7GBもある~!!!気持ちいい!(笑)」っていう具合に(^^;;; 仮に縦横1万ピクセルの画像をフォトショップでレイヤー重ねて編集しても、8GBもいかないんじゃないかな? それよりメモリ転送が追いつかなくて遅くて使ってられないと思うし(^^;;;

なんかいろいろ考えてたら、7用に一台新しいPCを買った方が安く済んで時間もかからず・・・のような気がしてきました・・・。

とりあえず・・・メインマシン(といっても現在一台しか無いんですが・・・)へのインストール作業は来月になってからになりそうです。

SQLite3

昨日、深夜にブラタモリの再放送やっててついつい観てしまいました。去年だったか一回だけ放送があって、帯でやってくれないかな~と期待してたんですが・・・10月から始まるようですね。「タモリ倶楽部」のスピンオフ的な番組のような気もしないでもないですが・・・さすがにゲストと番組のノリはNHKですね(^^;;;

それは、さておき・・・。

アプリケーションに組み込むタイプの軽量データベース・ライブラリ、SQLite3を使える環境をセットアップしようと思っていろいろファイルをダウンロードしました。

  • SQLite3 本体(コマンドライン版/DLL版/ソース)
  • System.Data.SQLite(C#から利用できるように)
  • GUIなDB管理マネージャ

適当なフォルダに突っ込んでパスを通してやれば使えるようになります。

ソースから静的リンクライブラリも一応作成して環境構築終了です。

で、ついでに、WSH( とくにJScript)で使用できるようにしたいな、と思い検索してみたんですが・・・探し方がバカなのか、見つからない。perlやpython,php,といったWEBアプリ系のスクリプトの記事はアホほどヒットするんだけど、JscriptやVBScriptなどから(要はCOMオブジェクトとして)使えるラッパーCOMサーバーのようなものをを見つけることができませんでした。COM自体もう時代遅れのトピックになりつつあって、多分に「イマサラ」感があるので需要が無いのかもしれませんね。JScriptはOS(正確にはIE?)に付属しているのでお手軽度的に言えばperlやphpやPythonやRubyや・・・・に勝っているとは思うんですけどね・・・。

・・・まぁ、データベースファイルをオープンして、SQLクエリを実行して、結果を得る、ということがなんとなくできれば・・・データベースファイルの管理はGUIで他のソフトに任せればいいんだし・・・と割り切って、昼休みの時間に作ってみようかなと。

C固有の型とJScriptで使用するVARIANT型の変換とか、SQLite3で定義されている構造体なんかをJscriptでどう表現すればいいのか? といった諸々を考えないといけないんですが・・・まぁなんとかなるでしょう。休み時間にコツコツと作ってみます(^^;;;

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とでデータを受け渡しする上で必ず付いてまわるのですが、あまりこのあたりを詳しく解説してある本を見つけることができないのがネックです。

この件の備忘録終了。