VC++ 2008 Expressを使ってWTLの環境設定とサンプルコンパイル
概要 :
WTLについて、もう少し、自身の勉強も含めて、記事の連載を行うことにしました。
昨今、QtがLGPLで提供され、今まで以上にフリーで利用できるGUIライブラリは、充実してきました。いまさら、WTLでもないような時代になってきたのかもしれません。
ただ、いまさらながら、処理速度を意識せえざるを得ない場合や、ファイルサイズを気にする場面が、業務でも、まだあります。少なくとも私は。
そんなときに、WTLは、速度といい、サイズ(MFCのようにDLLの添付がほとんど不要)が小さく、簡単な画面であれば、すぐに作って、メールで送ることができるので、個人的に重宝しております。
関連記事:
リソースエディタResEditとVC++ 2008 Exp.を連動させる
そもそもWTLって何でしょう?
WTLとは、そもそも何なのでしょうか?
MicroSoftサイトの記述がありました。一部を抜粋いたします。
参照元:
http://msdn.microsoft.com/ja-jp/magazine/cc163305.aspx
Windows® Template Library (WTL) の開発者は、Windows Vista®r で導入された新しいユーザーインターフェイス機能
および拡張のほとんどすべてを完全にサポートするこの優れたライブラリの新しいバージョンを最近リリースしました。
今月は、この最新リリースのいくつかの新機能に焦点をあてます。WTL および WTL の Visual C++® 開発環境での利用に
ついて馴染みのない読者のために、手短な説明から始めます。
Visual C++ チームは、可能な限り少量で高速なコードを生成する一方で COM クライアントおよびサーバーを簡単に作成
きるように、アクティブテンプレート ライブラリ (ATL) を開発しました。ユーザー インターフェイス アプリケーション
の開発を重視し、後になって COM のサポートが追加された MFC とは異なり、ATL は最初から COM 開発を念頭に設計され、
成果を上げています。ATL では、ユーザーインターフェイス開発については基本的なサポートしかありませんが、提供される
クラスは、より洗練されたユーザー インターフェイスライブラリの軽量な構成単位や基本クラスのように非常に便利です。
WTL は、想像し得る限りシンプルまたは複雑な、アプリケーション構築のための非常に豊富なクラス テンプレートのセット
により、ATL を拡張します。WTL は Visual C++ に付属していませんが、SourceForge Web サイト
(
http://sourceforge.net/projects/wtl)
または Microsoft ダウンロード センターのいずれでも入手できます。
WTL 8.0 は、本来 Windows Vista UI サポートの目的で開発されました。そこで、以前のコラムや記事で筆者が扱ったいくつか
のトピックに触れたいと思います。しかしながら、今月の重要な点は、新しく強化された WTL がこれらの新機能の導入を
いかに促進し、開発者自身が作成する必要のあるコードがいかに削減されるかということです。MSDN® Magazine Web サイト
から入手可能なこのコラムのダウンロードには、この記事で説明するほとんどの機能のサンプルが含まれています。
結局は、ATL(Active Template Library)を画面専用?に拡充(拡張)したライブラリ・・・といった感じでしょうか。
ATL/WTLがきっても切り離せないのは、このような関係だからですね。ExpressでWTLを使用する場合に問題になるのが、ATLをどうすかですね。
2005 Expressの時から、いろいろと話題になっていました。現在でも、Expressには、MFCとATLは含まれていません。
その問題を解消してくれるのが "Microsoft Platform SDK" です。これには、MFCもATLも入っています。(古いですが)
では、とれくらい古いものか、以下の表を参照ください。
Microsoft Platform SDK for Windows Server 2003 SP1 に含まれているMFCとATLは、VC++ 6.0までさかのぼります。
ATL(/WTL) | MFC | VC++ |
3.0 | 6.0 (mfc42.dll) | Visual C++ 6.0 |
7.0 | 7.0 (mfc70.dll) | Visual C++ .NET 2002 |
7.1(/7.5) | 7.1 (mfc71.dll) | Visual C++ .NET 2003 |
8.0(/8.0) | 8.0 (mfc80.dll) | Visual C++ 2005 |
※WTLのバージョンは、あくまで、ATLのバージョンに対して、新しい機能に対応しているWTLのバージョンです。
Sourceforgeで今でも公開されているバージョンのみ記載しています。
ATLのバージョンは、どのように調べますか?
ATLは、名前のとおり、テンプレートライブラリですので、ヘッダが基本です。特別にDLLが必要なわけではありませんので
バージョンは、どのように調べれば良いか・・・といえば、以下のヘッダソースに記載があります。
atldef.h
1
| #define _ATL_VER 0x0300
|
これが、ATLのバージョンです。
Microsoft Platform SDK for Windows Server 2003 SP1 は、上記のとおり、ATLの3.0が入っています。
前置きは、これぐらいにして、
この Visual C++ 2008 Express + Microsoft Platform SDK で実際にWTLを使ってみましょう。
まずは、インストール
インストールの詳細は、いろんなサイトで記載がありますので、そちらを参照してください。基本的に画面にしたがってインストールするだけです。
- Visual C++ 2008 Express Editionをインストール
- WindowsR Server 2003 SP1 Platform SDK もしくは (R2)インストール
- WTLをインストール
インストールを終えたら、2008用のWTLのインストール先へアプリケーション作成ウィザードを入れよう。
- WTLのインストール先へ、ZIPファイルを解凍し、コピーする。
- WTLのインストール先のAppWiz内のsetup90x.jsを実行する。
詳しくは、http://www.sfc.wide.ad.jp/~irino/blog/2008/09/visual-c-2008-expressappwizwtl8.phpへ。
実際に、筆者は、setup80x.jsをコピーして、自身で適当に改編して使っていますので、上記のように公開されていること自体、最近まで知りませんでした。
なので、使用したわけではありませんが、先人が公開されておりますので、そちらをご利用ください。
以下のものは、あくまで、筆者が、適当に改編しているものです。
保存用としてこのサイトへアップしております。(上記のリンクが切れていたりしたら、こちらで良ければご利用ください。)
- Visual C++ 2008 Express Editionのディレクトリへ、WTLのディレクトリと、Platform SDKに含まれるATLのディレクトリを追加する。
[ツール]->[オプション]->[プロジェクトおよびソリューション]->[VC++ ディレクトリ]-> ディレクトリを表示するプロジェクト:[インクルード ファイル]で追加
- %Platform SDKインストールディレクトリ%\Include (例:C:\Program Files\Microsoft Platform SDK\Include)
- %Platform SDKインストールディレクトリ%\Include\atl (例:C:\Program Files\Microsoft Platform SDK\Include\atl)
- %WTLインストールディレクトリ%\Include (例:C:\WTL80\include)
インストールは、これで完了だが、ATLのバージョンが古いため、最新のコンパイラでは、エラーになってしまう場合があります。
そのため、以下の2つのファイルを修正しなければならなりません。
- %Platform SDKインストールディレクトリ%\Include\atl\atlwin.h
- %Platform SDKインストールディレクトリ%\Include\atl\atlbase.h
- atlwin.h の1725行目あたりを以下のように変更する
1
2
3
4
5
6
7
8
| BOOL SetChainEntry(DWORD dwChainID, CMessageMap* pObject, DWORD
dwMsgMapID = 0)
{
int i;
// first search for an existing entry
for(i = 0; i < m_aChainEntry.GetSize(); i++)
|
- atlbase.h の287行目あたりを以下のように変更する
1
2
3
4
5
6
7
8
9
10
11
| /* Comment it
PVOID __stdcall __AllocStdCallThunk(VOID);
VOID __stdcall __FreeStdCallThunk(PVOID);
#define AllocStdCallThunk() __AllocStdCallThunk()
#define FreeStdCallThunk(p) __FreeStdCallThunk(p)
#pragma comment(lib, "atlthunk.lib")
*/
#define AllocStdCallThunk() HeapAlloc(GetProcessHeap(), 0, sizeof(_stdcallthunk))
#define FreeStdCallThunk(p) HeapFree(GetProcessHeap(), 0, p)
|
参照:
http://www.codeproject.com/KB/wtl/WTLExpress.aspx
サンプルをコンパイルしてみよう
WTLには、標準で簡単なサンプルがついています。まずは、そのサンプルをコンパイルして、環境が正しくできているかみてみましょう。
%WTLインストールディレクトリ%\Samples\MTPad
のディレクトリの "MTPad.dsw" を起動してみましょう。
自動的に古いVisla C++のプロジェクトを最新へ更新してくれると思います。
変換が終了して、読み込めたら、ビルドを実施してみましょう。
コンパイル終了!!
リンク失敗!!
以下のようなメッセージが表示されたことと思います。
リンクしています...
CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409.
LINK : fatal error LNK1123: COFF への変換中に障害が発生しました: ファイルが無効であるか、または壊れています。.
ビルドログは "file://c:\WTL80\Samples\MTPad\Debug\BuildLog.htm" に保存されました。.
これは、リソースファイルの設定の仕方が古いためにVisual C++ 2008では、エラーとなってしまうものです。
以下の行を削除すると、リンクできるようになります。
MTPad.rc 43行目
"CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST ""res\\\\MTPad.exe.manifest""\r\n"
MTPad.rc 399行目
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "res\\MTPad.exe.manifest"
リンクできたら、実行してみましょう。
以下のような画面で表示されたら、OKです。
WTLは、開発環境を全て無料で、構築することができ、さらにライセンス上も商用での利用も可ですし、
LGPLのようなリバースエンジニアリングの許容を強要する記述もありませんから、安心して使えるのかもしれません。
ただ、今後の展開が問題です。WTLは、それほど、開発者に人気のライブラリでもないので、今後、バージョンアップが
ちゃんと、行われるのか・・・が不安な点です。また、人気がない分、ウェブでの記事も少なく、情報量が、MFCなどに比べると
ぐんと少なくなります。
一番の救いは、手元に全てのソースコードが存在するこではないでしょうか。
上記を踏まえて、心してやれば、便利なライブラリであることは間違いないと思います。
関連記事:
リソースエディタResEditとVC++ 2008 Exp.を連動させる
結局のところ、WTLは、WindowsAPI+ATLとテンプレートの組み合わせです。
もっと、そのあたりについて詳しく知りたい方は、以下の本なども良いと思います。
はじめて間もない方は、2,3冊読まれると、ネットの記事を読んでも、おおよその理解ができるようになると思います。
本は、経験者でも、ネットだけでは判らない様々な事に気づかされることがあります。
コメントをどうぞ