そろそろ買い替え時

三宮のジュンク堂にC++ Boost関連の本を買いに行ったついでに、車を駐めているバーバーランドまで雨の中を散歩。センタープラザ出てすぐのところに結構絵になる建物があるんですが・・・

メディテラス

メディテラス

ここで撮影会とかモデル撮影・・・できないですよねぇ~(^^;;;人の往来が激しいので朝6時とかならいけそうですが・・・だれも受けてくれないかと(笑)

そんなことはさておき、本題。

今使っている液晶モニター、IOデータの24インチなんですが、輝度ムラというか、画面の場所によって暗部の明るさが違うのが段々気になるようになってきまして・・・買い替え検討しています。このIOデータのモニタ、アナログ地上波チューナー内蔵で結構重宝してたのですが・・・あと2年ほどでアナログ波停止するのでゴミ機能に(^^;;;

FlexScan SX2462W

先日EIZOから発表のあった、8月発売予定の「FlexScan SX2462W」にしようと思ってます。VAでなく、IPSパネルで入力端子にDisplayPortもあるし、値段もそんなにメチャクチャ高くないし、期待できそうです。やっぱり素人はナナオ神話に弱いです(笑)。

高すぎる

ケータイを買い替えようかなと、思っていましたが・・・今、携帯電話(DOCOMO)の端末ってメチャクチャ高いんですね・・・。今の持ってる機種は2年ほどまえに購入したものですが、そのときは2万円もしなかったんですが・・・これと同じくらいのスペックの新しい機種だともう高くて買えません・・・。カタログ見て欲しいと思った、NECのN-06Aなんて6万以上するし・・・。諦めて今のケータイのバッテリを買い替えただけでドコモショップを出ました(^^;;;

で、土曜日、個人撮影が終わってスタジオを出たのが夜9時。家に着いたのが10時過ぎ。ヘロヘロでなんとかToday’sだけ更新して寝てしまいました。今日(日曜)は良い天気だったのに寝て、テレビ見て、パソコン触って、昼寝して・・・なんていうもったない一日を過ごしてしまいました。体調もようやく戻ってきたのに(薬のおかげですけど)・・・公園に花マクロでもしにいけば良かった・・・。

予約しました。

マイケル・ジャクソンの突然の死。ビックリしました。何かと話題のあるスターでしたね~。スリラーは中学の時?MTVとかでよく見ました。ファンというわけではありませんが、最初のころは良かったなぁ。マイケルジャクソンではないですが、彼が作曲したwe are the world. は僕の好きな曲です。ムーンウォークをよく学校で友達と真似したのを思いだします(^^;

それはさておき・・・、

Windows7の参考価格が発表され、今日から10日間マイクロソフトのストアで予約すると、アップグレード価格が半額になる、という大盤振る舞い企画に、僕はコロッと逝ってしまい(笑)、今日の昼休みにWindows7 Professionalを予約してしまいました(^^

Windows7

Windows7

アメリカでは10月発売みたいですが、日本版は11月ぐらい? それとも世界同時になるのか?OSがリリースするのにソワソワするのは、Windows95が出たとき以来、ひさびさ。フィルムスキャナのドライバの関係でVistaにアップグレードするのをためらっていましたが、7ではXPモードがあるので安心してバージョンアップできます。

追記:
既にHome Premiumが在庫切れになっているみたいです(笑)

VC++ 2008EE で COMサーバーをカンタンに作成

【追記】
ご承知のように、Visual Studio Commuity Edition がリリースされました。ライセンス的にやや難がありますが、商用/非商用アプリケーションの個人開発者にはVisual Studio の Professional 版相当のフルセットが無料で提供されるようになりましたね、バンザーイ!
ってことで、このページの内容は、意味をなさないので、とっととCommuity Editionをインストールしてラクをしてください。


備忘録のエントリです。

フリーの開発環境でラクにCOMサーバーを作ろう、という主旨です(^^;;;

キーワードは「C++属性」です。この属性を利用することで手作業であっても退屈なメンドクサイ、コードの大部分(ほとんど)が自動的に作成されます。コーディングするのは、実装するインターフェイスのメソッドの中身だけ。簡単です。ただ・・・ATLだけはどうしても必要です。

しかし・・・Visual Studio 2008 Express EditionにはATLは付属していません。

ATLのヘッダーファイルとライブラリファイルをどこぞから調達しなくてはいけませんが、幸いなことにマイクロソフトがこれまた無料で配布しているWDK(Windows Driver Kit)をインストールすることにより利用することが可能です。WDKはかつては DDK(Driver Developper Kit)と呼ばれていたモノです。WDKにはVC++2008と同じコンパイラ・リンカなどの開発ツール、ATL/MFCやWindowsでのカーネルモードドライバを作成するために必要なすべてのファイル・ドキュメントが同梱されています。

無料で手に入れることができるのですが・・・一点、不安なことがあります。

それは・・・Visual Studio 2008 Express Editionと、WDK内の構成ファイル(ATLヘッダーファイルとライブラリファイル)を混ぜてコードをビルドするのがライセンス的に良いのか駄目なのか・・・等は、調査不足で分かりません。Visual Studio 2008 Express Editionで作成したアプリケーションは商用・非営利を問わず配布できたかと思いますが、WDKはそのあたり分かりません。まぁ非営利・個人的な利用なら問題はないかと思いますが・・・。

(WDKのダウンロードにはWindows Liveやマイクロソフト・パスポートのアカウントが必要です)

MSのダウンロードセンターからダウンロードできるようになってました。( 2012/1/11)

で、話を本題に戻します。 このWDKをインストール後、VC++ 2008 Express Editionのディレクトリ設定にこれらのパスを追加登録してあげればATLを利用したアプリケーション開発が可能となります。ただし、ATL関連ファイルがあるというだけで、便利なプロジェクト・ウィザードはないので全部手作業です(^^;;; やっぱりラクはできません(笑)。

さて、COMサーバーの実際の手順なんですが・・・これは日本語ドキュメントが既にあります(^^ MSDNライブラリの「COM属性によるCOM DLLの開発 -> チュートリアル : テキスト エディタを使った COM サーバーの作成」です。

サンプルがありますのでこれを自分用に修正していけばいいだけ。僕は以下のようにMyServerというCOMオブジェクトをテストとして作成することにしました。見れば分かりますが・・・[ ] でくくっているところが属性と呼ばれるマイクロソフトの独自の拡張です。かなり違和感のあるコーディングです。が、これをコンパイルすることで必要なファイル、足りないコードを自動生成してくれます。理屈は分かりません(笑)  ある程度理解するにはやはりCOM/ATLの知識が必要です。魔法(ブラックボックス)として扱うのがよさそうです。

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

#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 <windows.h>
//#include <comutil.h>

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

/////////////////////////////////////////////////////////////////////////////
// IMyServer
[
   object,
   oleautomation,
   dual,
   helpstring("IMyServer Interface"),
   pointer_default(unique)
]
__interface IMyServer : IDispatch
{
   //メソッドを定義
   HRESULT CurrentDirectory([out,retval]BSTR *sPath);
};

/////////////////////////////////////////////////////////////////////////////
// CMyServer
[
   coclass,
   threading(apartment),
   vi_progid("MyServer.Utility.1"),
   progid("MyServer.Utility.1"),
   version(1.0),
   helpstring("MyServer Class")
]
class ATL_NO_VTABLE CMyServer :
   public IMyServer
{
public:
   CMyServer()
     {
       //コンストラクタ
     }

  //メソッドの実装
  HRESULT CurrentDirectory(BSTR *sPath)
    {
      WCHAR pBuffer[MAX_PATH+1] = {0};
      ::GetCurrentDirectoryW(MAX_PATH+1,pBuffer);

      *sPath = ::SysAllocString(pBuffer);

      return S_OK;
    }
  DECLARE_PROTECT_FINAL_CONSTRUCT()
  HRESULT FinalConstruct()
    {
      return S_OK;
    }

  void FinalRelease()
    {
      return;
    }
};

IMyServerインターフェイスを定義して、CMyServerクラスで実装。インターフェイスメソッド、CurrentDirectory()を定義。これは現在のカレントディレクトリを文字列で返すメソッドをサンプルとして定義しました。必要に応じてインターフェイスやメソッドを増やしたい場合もチョチョッと手を加えるだけで済みます。

んで、これだけのコードで完璧なオートメーションサーバーができてしまいます。属性の詳細は・・・あまり知る必要はないかと。詳細はかなり難解です。何度も書きますが、理解するにはCOMとかATLに関する中級~上級レベルの知識が必須かと。ただ公開するものの実装さえしてやればいいので、あとのCOMに関連するおきまりのコードはコンパイラとリンカが勝手にやってくれますのでかなりラクです。従来ならIDLファイルを書いて、IDispatch,IUnknowを実装して、レジストリへの登録処理を書いて・・・などが必要でしたが・・・。

このファイルをたとえば  cl /LD MyServer.cpp /link /TLBOUT:MyServer.tlb  みたいにコンパイルしてやればインプロセスサーバー(DLL)、タイプライブラリが生成されます。

あとはRegsvr32.exe でDLLファイルを登録し、以下のようなテストコードで動作確認。
===MyClient.wsf===

<?xml version="1.0" encoding="Shift-JIS"?>
<job id="myScript">
<script type="text/jscript">
<![CDATA[
try
{
  var obj = new ActiveXObject("MyServer.Utility.1");
  WScript.Echo(obj.CurrentDirectory());
}
catch(e)
{
  WScript.Echo(e.message);
}
]]>
</script>
</job>

パフォーマンスにシビアなコードはC++で実装して、あとはC#やJScriptでお手軽に・・・というような用途にいいかもです。

Windows7(E)とはなんぞや

IEとは、もちろん、Microsoft Internet Explorer(面倒なので以下IEと略す) のこと。

記憶が正しければ・・・確か、マイクロソフトはバージョン4でIEを構成する主要なモジュールをOSに組み込んだ。IEとExplorerシェルを統合した、シェル統合なんていうインストールオプションがIE4にはあって、Windows98以降のWindowsには標準でIEを構成する主要モジュールが組み込まれたと思う。

おそらく、マイクロソフト(以下MS)はHTMLをエクスプローラの表示記述言語?にしたかったんでしょう。HTMLを書き換えるだけでフォルダウィンドウの内容が自在に変えられる。きっと今後UIの開発が容易になる! と、思ったかどうかは分かりませんが、これがMSを悩ます問題の発端の一つになっていることはには違いない。

最近になってEU(ヨーロッパ)で販売されるWindows7にはIEを搭載しない特別なバージョン(最後にEがつくらしい)になると発表されたみたいだ。ことの発端はOperaというブラウザを開発するヨーロッパの会社が、欧州委員会を巻き込んでチャチャを入れたことから始まる。Operaといえば一部に熱狂的なユーザーがいることで知られるブラウザで携帯やPDAなんかにもOperaが入っているものが多い。

名目上は独禁法違反で訴訟なんだけど、この欧州委員会による訴訟の根本は昔から変わっていない。ソースを開示しろ、仕様を決めさせろ、お金を払え、等々、要するにマイクロソフト叩き、もっといえば、アメリカに対する嫌悪感じゃないかと勝手に思ってます。

しかもマイクロソフトがIEのバンドルをやめたバージョンを発売すると発表してもなお、文句を言うのだ。IEのバンドルをやめるのではなく、複数のブラウザをはじめからWindowsにバンドルしておきユーザに選ばせろ!という。じゃぁ、標準でバンドルされるブラウザはどうやって決めるのか?PCメーカーならPCメーカーが決めればいい話だと思うけど、リテール版なら・・・?利害関係がゴチャゴチャにからまりそうです(^^;;;

当然MSは拒否。あたりまえだ。そんな、あえて火の中に飛び込むのかと。

WindowsにIEをバンドルしない、ということが、もしIEのモジュール全てを搭載しない、という意味なら、IEのモジュールを再利用して作成されたアプリケーションはまず動かないでしょう。悲しいことにそういうソフトウェアはゴマンとある。

もしこれが日本なら・・・ま、そりゃないな。