« 2006年11月 | メイン | 2007年01月 »

前の10件 1  2  3  4  5  6  7  8  9  10

2006年12月 記事一覧

パソコンに接続されているデバイスを一覧する

test51_01.gif
デバイスマネージャーから見ることができるようなデバイスの一覧を取得する方法はいくつかあるが、Setup APIを利用すると比較的簡単に取得できる。
デバイスはSetupDiEnumDeviceInfoを使って列挙できる。あとは見つかったデバイスから必要な情報を取得すればいい。

test51_02.gif
SetupDiGetDeviceRegistryPropertyを利用すればデバイスに関する各種情報を取得できる。ここではデバイスの説明用文字列の取り出しのみに利用し、列挙されたすべてのデバイスをMessageBoxで表示するようにした。

#include "atlstr.h"

#include <devguid.h>
#include <regstr.h>
#include <setupapi.h>
#pragma	comment(lib,"setupapi.lib")


bool	Test(void)
{
	bool			ret;
	DWORD			dwIndex;
	TCHAR*			pszName;
	DWORD			dwSize;
	DWORD			dwRegType;
	BOOL			bRet;
	HDEVINFO		hDevInfo;
	SP_DEVINFO_DATA	sDevInfo;
	CAtlString		strMessage;

	hDevInfo = ::SetupDiGetClassDevs(NULL,0,0,DIGCF_PRESENT | DIGCF_ALLCLASSES);
	if(hDevInfo == INVALID_HANDLE_VALUE)
		return false;

	ret = false;
	dwIndex = 0;
	::ZeroMemory(&sDevInfo,sizeof(SP_DEVINFO_DATA));
	sDevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
	while(1)
	{
		bRet = ::SetupDiEnumDeviceInfo(hDevInfo,dwIndex++,&sDevInfo);
		if(bRet == FALSE)
			break;
		ret = false;

		//デバイス名(説明)の取得
		dwSize = 0;
		bRet = ::SetupDiGetDeviceRegistryProperty(hDevInfo,&sDevInfo,SPDRP_DEVICEDESC,&dwRegType,NULL,0,&dwSize);
		pszName = new TCHAR[dwSize];
		if(pszName == NULL)
			break;
		bRet = ::SetupDiGetDeviceRegistryProperty(hDevInfo,&sDevInfo,SPDRP_DEVICEDESC,&dwRegType,(BYTE*)pszName,dwSize,&dwSize);
		if(bRet == FALSE)
		{
			delete	pszName;
			continue;
		}

		strMessage += pszName;

		delete	pszName;

		{
			//フレンドリーネームの取得
			//取得できないことが多いので取得できない場合もcontinueしない
			dwSize = 0;
			bRet = ::SetupDiGetDeviceRegistryProperty(hDevInfo,&sDevInfo,SPDRP_FRIENDLYNAME,&dwRegType,NULL,0,&dwSize);
			pszName = new TCHAR[dwSize];
			if(pszName)
			{
				bRet = ::SetupDiGetDeviceRegistryProperty(hDevInfo,&sDevInfo,SPDRP_FRIENDLYNAME,&dwRegType,(BYTE*)pszName,dwSize,&dwSize);

				if(bRet)
				{
					strMessage += _T(" (");
					strMessage += pszName;
					strMessage += _T(")");
				}

				delete	pszName;
			}

		}

		strMessage += _T("\n");
		ret = true;
	}

	::SetupDiDestroyDeviceInfoList(hDevInfo);

	::MessageBox(NULL,strMessage,_T(""),MB_OK);

	return	ret;
}
プロジェクトファイルをダウンロード

使われているデバイスドライバーを列挙する

test52.gif
EnumDeviceDriversを利用するとWindowsに読み込まれているすべてのデバイスドライバーへのアドレスを取得できる。このアドレスに対してGetDeviceDriverFileNameを利用すると読み込まれているデバイスドライバーのファイル名を知ることができる。

依存環境:ATL
#include "atlstr.h"

#include <psapi.h>
#pragma	comment(lib,"psapi.lib")

//Windows NT 4.0以降対応
bool	Test(void)
{
	int			i;
	int			nSize;
	LPVOID*		ppDrivers;
	DWORD		dwNeeded;
	BOOL		bRet;
	TCHAR		pszDriverName[2048];
	CAtlString	strMessage;

	dwNeeded = 0;
	bRet = ::EnumDeviceDrivers(NULL,0,&dwNeeded);
	if(dwNeeded == 0)
		return	false;

	ppDrivers = (LPVOID*)new BYTE[dwNeeded];
	if(ppDrivers == NULL)
		return	false;
	bRet = ::EnumDeviceDrivers(ppDrivers,dwNeeded,&dwNeeded);

	nSize = dwNeeded / sizeof(LPVOID);
	for(i = 0; i < nSize; i++)
	{
		bRet = ::GetDeviceDriverFileName(ppDrivers[i],pszDriverName,2048);
		if(bRet == FALSE)
			continue;

		strMessage += pszDriverName;
		strMessage += _T("\n");
	}

	delete	ppDrivers;

	::MessageBox(NULL,strMessage,_T(""),MB_OK);

	return	true;
}

プロジェクトファイルをダウンロード

Windows Vista Ultimate(製品版)をVirtual PC 2004にインストールする

vista_01.gif
少し前からMicrosoftのMSDNやTechNetの有料会員向けにWindows VistaやOffice 2007の製品版ダウンロードが開始されたのでさっそくダウンロードした。
日本語版Windows Vistaの場合は32ビット版がDVD1枚もしくはCD4枚で、64ビット版がDVD1枚のイメージファイルで提供されている。含まれるエディションは
SterterからHome Basic、Home Premium、Business、Ultimateなど。
私はDVDイメージをダウンロードしたのだが...容量が2.4GBもありVirtual PC 2004では図のようなエラーが出て正常にマウントできなかった。そのためDeamon ToolsでマウントしたものをVirtual PC 2004からアクセスしてインストールした。

vista_02.gif
「Windows is loading files...」という昔ながらの淋しいユーザーインターフェースで起動が始まった。


vista_03.gif
と思ったのもつかの間、すぐに「c Microsoft Corporation」と書かれたプログレス表示画面に切り替わった。


vista_04.gif
そしてオーロラのような柔らかい色使いの背景が表示された。このような色彩はWindows XPには(あまり)なかったから何となく新鮮。

vista_05.gif
そしてインストール画面が開いた。このときから既にウインドウスタイル。きちんとタイトルバーなども用意されている。

vista_06.gif
そして2画面目でいきなり「今すぐインストール」の表示。Windows XPまでのように使用承諾書を読ませて[F8]キーを押させるのようなことはしなくなったようだ。

vista_07.gif
そして「お待ちください...」と待たされる。


vista_08.gif
いきなりファイルのコピーなどインストールが開始されるのかと思いしやプロダクトキーの入力画面が開いた。
ここでにプロダクトキーの入力は必須ではない。入力しなくてもインストールができる。これは今まではなかった新しい形かな?

vista_09.gif
普段この手の警告画面が表示されると読みもせずに「はい」ボタンを押す。しかしここで押すと再びプロダクトキー入力画面に戻ってしまい、先には進めない。これはOffice 2007のインストール時に1回だまされたので今回は引っかからなかった。


vista_10.gif
これが2つ目にビックリした画面。なんと購入したWindows Vistaのエディションを選択する画面が現れる。このことは...安価なWindows Vista Starterを購入しても、プロダクトキーの必要なく最上位のWindows Vista Ultimateがインストールできることを意味している。Microsoftが新しい不正利用対策に力を注ぎ、それが有効だという自信の表れのような気がする。

vista_11.gif
ここまできてようやく使用承諾書が表示された。ここで気がついたのだが、Windows Vistaではプロダクトキーやエディションによって使用承諾書の内容が異なるから、使用承諾書の表示をここまで引っ張ったのだろう。今回はプロダクトキーを入力せずにインストール作業を行っているのでデフォルトのライセンス内容になっているはず。

vista_12.gif
さらに次の画面では「アップグレードは無効になっています」の表示。今回はVirtual PCへの新規インストールだから以前のWindowsは存在しないためだ。Windows VistaではWindows XPのときよりもアップグレード条件が厳しい。Windows XPからWindows Vista Home Basicへのアップグレードをしようとした場合なども今回と同じように無効だと言われる。

vista_13.gif
そしてインストール場所の指定。ここではドライバの読み込みオプションも用意されている。標準でサポートされていないデバイスへのインストール時に利用するのだろう。

vista_14.gif
そしてようやくファイルのコピーが始まった。

vista_15.gif
この「Windows ファイルのコピー中」と「ファイルの展開中」が非常に時間がかかった。Virtual PCへのインストールで、しかも仮想HDDは無線LAN上に置かれたNASへ保存しているというのも遅い原因の1つだが、それにしてもかかりすぎ。ということで途中で眠くなったので一度Virtual PCを止めて寝てしまった。

vista_16.gif
そして数時間後に起きてから再び作業開始。

vista_17.gif
ようやくすべての作業が終わって再起動画面が開いた。10秒間待ってから再起動する。別に待たずとも再起動してもいいとは思うのだが...いきなり再起動するとインストールに失敗したと錯覚するからだろうか?

vista_18.gif
そして再起動。再び前に見たプログレス画面が開き...

vista_19.gif
そのままWindows Vista的な画面が開くのかと思ったのだが、予想を裏切り白いロゴだけの画面が開いた。

vista_20.gif
そしてこれがまた長い。「.」が2行目終わりまで進んでいった。

vista_21.gif
そして新しい時計カーソルの円盤が表示。

vista_22.gif
再びバックグラウンドが鮮やかな色になり...

vista_23.gif
再びこの画面。「インストールの最終処理の実行中」とのこと。

vista_24.gif
そして再び再起動。またプログレス画面が表示された。

vista_26.gif
そしてアカウント名のインストール画面。ユーザー名の例が「John」になっている。日本語OSなんだからほかの名前にすればいいのに。

vista_27.gif
そしてセキュリティ設定。Windows XPのように「更新を自動ダウンロードするが、インストールは手動で実行する」などのオプションはなくなり、インストールするかしないかの選択になっている。

vista_28.gif
そしてタイムゾーン設定。時計が本当の壁掛け時計チックになっている。

vista_29.gif
次は現在の場所の設定。「公共の場所」が用意されているが...空港やコーヒーショップでWindows Vistaのインストールをするユーザーがはたしてどれくらいいるのだろうか疑問。

vista_30.gif
最後はお礼を言われて「開始」ボタン。

vista_31.gif
そしてパフォーマンスの確認作業。おそらくここで新しい視覚効果の有効/無効設定が行われるのだろう。

vista_32.gif
Windows XPのインストール時に表示されていたようなコメントがようやく表示。この手の説明書きは時間のかかるファイルのコピー中に表示すればいいのに。

vista_33.gif
そしてなんとなくカッコいいロゴマークが表示。Windows Vistaではデザイナーにかなりお金を払っている予感。

vista_34.gif
そして「ようこそ」の表示。「Start」ボタンもどうかと思うがこの辺はいまだにセンスが悪い?

vista_35.gif
初回起動時だったのでデスクトップの準備が始まった。

vista_37.gif
ここまで来て再びびっくり。だいぶ前のWindows 2000やWindows Meスタイルのウインドウが表示されている!

vista_38.gif
と思ったらすぐに視覚効果が入ってWindows Vistaスタイルのウインドウに切り替わった。

vista_39.gif
さらに若干スタイルが変わりながらセットアップが進む。

vista_40.gif
ウインドウ枠などが変更された。

vista_41.gif
このスタイルで確定したと見える。テーマのセットアップが終わり、次はWindows Media Playerの設定。

vista_42.gif
そしてデスクトップ関連コンポーネント。

vista_43.gif
今度は「rundll32.exe」や「mscories.dll」の設定。このような文字列をそのまま使うのはいかがなものかと思うのだが。

vista_44.gif
そして「Internet Explorer」の設定。IEはWindows Vistaに搭載されるバージョン7から、名前が「Windows Internet Explorer」に変更されたと思うのだが...ここでは「Internet Explorer」のままになっている。

vista_45.gif
「ブラウザのカスタマイズ」。同じソフトをInternet Explorerと表現したりブラウザとしたりかなり統一されていない雰囲気。

vista_46.gif
そしてようやく設定が終了。

vista_47.gif
タスクバーが表示された。「スタート」ボタンはWindowsのロゴマークに取って変わっている。

vista_49.gif
ごみ箱は...普通のドキュメントのようなアイコン?!

vista_50.gif
と思ったらすぐにコップのような形に変わった。Virtual PCが遅いせいなのかこのようなアイコンの切り替えがもたつくことがよくあった。
ちなみに日本語で「ごみ箱」は英語では「Recycle Bin」。言ってみればリサイクル箱という感じだろうか?ごみ箱に入れた削除したファイルを復活できることからも「リサイクル」という方があっているように思う。

vista_51.gif
起動が終了したら即時に「更新プログラムのダウンロードとインストールを実行中」の通知。もう更新チェックに行っているなんて...

vista_52.gif
自動更新で勝手に設定を変更されると困るのですぐに「スタート」ボタンから電源マークを選択して電源を切る。
Windows XPまでの「終了オプション」から「電源マーク」に変わっていたから一瞬、電源をどうやったら切れるのか迷ってしまった。

vista_53.gif
選択するとすぐにログオフ画面が表示。

vista_54.gif
そしてシャットダウンが始まって電源が切れた。

vista_55.gif
ここまでインストールしてVirtual PCの仮想HDDイメージを見てみるとファイルサイズは5.53GB。たかだかOSを入れただけなのにこんなに使っていた。このファイルはとりあえずコピーして保管することに。コピーにかかった時間は3時間。さすがに無線LANは遅すぎる。VHDファイルのバックアップは取ったがVirtual PCで復元ディスクのオプションを入れておくことに。これでようやくWindows Vista Ultimateでのテスト環境が手に入った。


2006年12月09日

Windows Vistaのガジェットを作る

Windows Vistaに標準で備わる「サイドバー」などに配置できる「ガジェット」は簡単に作ることができる。簡単なガジェットはxmlファイルとhtmlファイルの2つのファイルで実装できる。

具体的には…

■xmlファイル。ファイル名を「gadget.xml」にする
<?xml version="1.0" encoding="utf-8" ?>
<gadget>
	<name>Test53</name>
	<namespace>Test53</namespace>
	<version>1.0.0.0</version>
	<description>Test53 Gadget</description>
	<author name="usefullcode.net">
		<info url="www.usefullcode.net" />
	</author>
	<copyright>2006</copyright>
	<hosts>
		<host name="sidebar">
			<base type="HTML" apiVersion="1.0.0" src="Test53.html" />
			<platform minPlatformVersion="0.3" />
			<permissions>Full</permissions>
		</host>
	</hosts>
	<version value="1.0.0.0" MinPlatformVersion="0.1"/>
</gadget>

■htmlファイル。ファイル名を「Test53.html」にする
<html>
<head>
<script>

function Test()
{
	content.innerText = "あいう。テスト";
}

</script>
</head>

<body style="width:100%;height:100px;"onload="javascript:Test();">
<div id="content" style="overflow:auto"></div>
</body>
</html>

という2つのファイルを用意する。


test53_01.gif
そしてWIndows Vista上で
「C:\Users\○○\AppData\Local\Microsoft\ Windows Sidebar\Gadgets」
の中にフォルダーを作り、xmlとhtmlファイルをその中に保存する。

このとき注意しなければいけないのがフォルダ名。名前を「○○.gadget」のように「.gadget」をつけなければいけない。

test53_02.gif
サイドバーを右クリックして現れるメニューから「ガジェットの追加」を選択する。

test53_03.gif
そして現れるガジェットの一覧の中から作成した「Test53」を探してダブルクリックする。

test53_04.gif
これで作成したガジェットを表示できた。

test53_05.gif
ガジェットが不要なら、ガジェットを右クリックして現れるメニューから「削除」を選択する。

test53_06.gif
これで元通り何もないサイドバーに戻った。

プロジェクトファイルをダウンロード

ガジェット用のActiveXコントロールを作る

test54_01.gif
Windows Vistaで利用できるガジェットはhtmlとxmlファイルで構成される。htmlファイルではjavascriptなどが利用できるため、それなりに凝った動作を実装できる。とは言うもののスクリプトには限界がある。ActiveXコンポーネントなどを利用すればより自由な実装ができる。
ガジェットから使えるActiveXコンポーネントを作成しよう。Visual Studio 2005の「ファイル」メニューの「新規作成」から「プロジェクト」を選択する。

test54_02.gif
左側のプロジェクトの種類にある「Visual C++」以下の「ATL」を選択する。そしてテンプレートとして「ATLプロジェクト」を指定する。ここではプロジェクト名を「Test54」とした。

test54_03.gif
ATLプロジェクトウィザードではデフォルトの設定を用いる。

test54_04.gif
プロジェクトが自動生成したら「プロジェクト」メニューから「クラスの追加」を選択する。

test54_05.gif
そしてカテゴリ「ATL」にある「ATLコントロール」を追加する。

test54_06.gif
ここでは短い名前として「TestButton」を指定した。ほかの入力欄は自動的に埋まる。

test54_07.gif
次に「表示」タブにあるコントロールの追加から「Button」を選択する。これでコントロールの設定が終わったので「完了」ボタンを押す。

test54_08.gif
コントロールが追加されたら生成したソースファイルの中から「TestButton.h」をダブルクリックする。そしてソースコードの中から「OnBNClicked」関数を探す。

test54_09.gif この関数は名前の通りボタンが押された時に実行されるものだここにメッセージボックスを表示するための命令を追加する。
	LRESULT OnBNClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		// TODO : ユーザーのコードをここに追加してください。

		::MessageBox(NULL,_T("ボタンが押されました!"),_T(""),MB_OK);

		return 0;
	}


test54_10.gif
次に作成したコントロールをWindows Vistaにセットアップするためのインストーラーを作成する。

「ファイル」メニューの「追加」から「新しいプロジェクト」を選択する。「追加」であることに注意すること。「新規作成」を利用してはいけない。

test54_11.gif
プロジェクトの種類として「セットアップと配置」を、テンプレートは「セットアップウィザード」を選択する。

test54_12.gif
これでインストーラーを作成するためのウイザードが開いた。

test54_13.gif
ここはデフォルトのまま次へ進む。

test54_14.gif
そして含めるプロジェクト出力の選択では「Test54のぷらいパリ出力」にチェックを入れる。これで「完了」ボタンを押す。

test54_15.gif
セットアッププロジェクトが生成したら「アプリケーションフォルダ」にある「Test54(アクティブ)のプライマリ出力」を右クリックして「プロパティウィンドウ」を開く。

test54_16.gif
開いたら「Register」の項目を「vsdrpCOMSelfReg」に変更する。これを行わないとインストールしても作成したActiveXコントロールが利用できない。

test54_17.gif
最後にツールバー部分のビルドモード選択欄から「Release」を選択してSetup1の右クリックメニューから「リビルド」を選択して実行ファイルを生成する。

test54_21.gif
生成したセットアップファイル2つをWindows Vistaへコピーする。

test54_22.gif
そして「Setup.exe」を起動する。

test54_23.gif
すると警告画面が現れる。ここで「許可」を選択する。

test54_24.gif
するとインストーラーが起動するのでセットアップを続ける。

test54_25.gif
インストール先フォルダなどの設定項目はそのままでいい。

test54_26.gif

test54_27.gif

test54_28.gif
これでインストールが無事完了した。

test54_29.gif
インストール中に「モジュール○○で登録に失敗しました。HRESULT -2147010895。サポート担当者に問い合わせてください。」というエラーが生じた場合は、リビルドするときに「Release」を選択せずに「Debug」のままである可能性が高い。もう一度リビルドからやり直す。

test54_18.gif
インストーラーを作る時にガジェット用のhtmlやxmlファイルを自動インストールするようにもできるが、ここではその設定を行わなかった。そのためこのままではガジェットを利用できない。

次にガジェット用のhtmlとxmlファイルを作成する。再び開発環境に戻り、プロジェクトフォルダにある「TestButton.htm」のソースコードを見る。

test54_19.gif
ここで赤線で示した部分をクリップボードにコピーしてガジェット用htmlファイル内で利用する。さらにxmlファイルも作成する。

■htmlファイル。ここではファイル名を「Test54.html」とした。
<html>
<head>
</head>

<body style="width:100%;height:100px;"onload="javascript:Test();">

<OBJECT ID="TestButton" CLASSID="CLSID:1C335D84-2F4F-43C9-A378-6197FCD35E34"></OBJECT>

</body>
</html>
■xmlファイル。ここではファイル名を「gadget.xml」とする。
<?xml version="1.0" encoding="utf-8" ?>
<gadget>
	<name>Test54</name>
	<namespace>Test54</namespace>
	<version>1.0.0.0</version>
	<description>Test54 Gadget</description>
	<author name="usefullcode.net">
		<info url="www.usefullcode.net" />
	</author>
	<copyright>2006</copyright>
	<hosts>
		<host name="sidebar">
			<base type="HTML" apiVersion="1.0.0" src="Test54.html" />
			<platform minPlatformVersion="0.3" />
			<permissions>Full</permissions>
		</host>
	</hosts>
	<version value="1.0.0.0" MinPlatformVersion="0.1"/>
</gadget>

test54_20.gif
作成したhtmlとxmlファイルを
「C:\Users\○○\AppData\Local\Microsoft\ Windows Sidebar\Gadgets\Test54.gadget」
に保存する。これでガジェットを利用するための準備が整った。

test54_30.gif
サイドバーで右クリックをして現れたメニューから「ガジェットの追加」を選択する。

test54_31.gif
そして一覧の中にある「Test54」をダブルクリックする。するとサイドバーに作成したガジェットが表示される。

test54_32.gif
htmlファイルやボタンデザインの設定を行わなかったためにボタンに見えないかもしれないが一応ボタンらしきものが表示されている。このボタンをクリックすると...

test54_33.gif
メッセージボックスが表示された。

ここではメッセージボックスの表示だけだがOnBnClickedに処理を記述すれば何でもできる。またボタン以外のコントロールとして作成することもできる。

プロジェクトファイルをダウンロード

Visual Studio 2005をバイナリエディタとして使う

binary00.gif
Visual Studio 2005にはバイナリエディタ機能が備わっている。

少なくとも私はバイナリエディタにお世話になることが多い。普段はWzEditorのバイナリエディタ機能を利用しているが、このエディタは検索機能に癖があるため必要な部分がファイル半ばにあるときはなかなか目的の部分まで辿りつけない。そんなときにVisual Studio 2005のバイナリエディタ機能が役に立つ。

binary01.gif
「ファイルを開く」ウインドウでバイナリエディットをしたいファイルを指定したら、「開く」ボタンのドロップメニューから「ファイルを開くアプリケーションの選択」を選ぶ。

binary02.gif
すると選択画面が開く。ここから「バイナリエディタ」を選び、「OK」ボタンを押す。

binary03.gif
開くのはちょっと面倒だがこれでVisual Studio 2005に読み込まれたファイルをバイナリエディットできる。

binary04.gif
もちろん検索機能などIDEの機能を全部ではないがかなり利用できる。

binary05.gif
欲を言えば自動的に逆アセンブルしてくれる機能とか、インポートされている関数へのジャンプ機能とかも一緒に動けば便利なんだけど...そうなったら「バイナリエディタ」と呼ぶのは難しくなるからダメか。

英語版Windows XPで日本語を使う


enxp1_01.gif
英語版のWindows XPをインストールしただけの状態で日本語版のソフトを動かそうとするとこのように日本語部分が「□□」と表示されてしまう。
ここでは英語版のWindows XPで日本語を表示したり入力するための設定を行う。

enxp1_02.gif
英語版のWindows XPでも日本語が表示できるようにするには日本語フォントをインストールする必要がある。
設定のため「start」メニューから「Control Panel」を選択してコントロールパネルを開く。

enxp1_03.gif
コントロールパネルの中にある「Date, Time, Language, and Regional Options」を選択する。

enxp1_04.gif
次に「Add other languages」を開く。

enxp1_05.gif
そして現れたウインドウで「Install files for East Asian languages」にチェックを入れて「Apply」ボタンを押す。

enxp1_06.gif
すると日本語を含めた東洋フォントのインストールが始まる。

enxp1_07.gif
このままでは日本語の表示はできるが入力ができない。そのため日本語入力用のIMEをインストールする。設定するため「Details」ボタンを押す。

enxp1_08.gif
そして開いたウインドウで「Add」ボタンを押す。

enxp1_09.gif
ここで「Input language」から「Japanese」を選択する。すると自動的に「Keyboard layout/IME」欄が「Microsoft IME Standard 2002 ver. 8.1」のように変わる。
もしも「Japanese」が選択欄に存在しない場合は、フォントがインストールされていないのでもう一度はじめから作業しなおす。

enxp1_10.gif
これで「Japanese」という項目が追加された。

enxp1_11.gif
「OK」ボタンを押すと再起動を促されるのでそのまま再起動する。

enxp1_12.gif
すると次回起動時から日本語がきちんと表示できるようになった。
日本語を入力するにはタスクバーにある「EN」の表示をクリックして現れたメニューから「Japanese」を選択する。

enxp1_13.gif
そしてさらに右クリックをして現れたメニューから「Restore the Language bar」を選択して言語バーを表示させる。

enxp1_14.gif
そして現れた言語バーの「Inpute Mode」をクリックして現れたメニューから「Hiragana」を選ぶ。

enxp1_15.gif
これでIMEの日本語入力が有効になり日本が入力できる。


多言語プログラミングにはいろいろな方法がある

■英語版のWindowsでも動作する日本語ソフト
mui01.gif
多言語プログラミングの手始めは「実際に英語版OSで動く」というものだ。

単純なソフトであれば何も意識しなくとも英語版のOSで動作する(ことが多い)。しかし「試してないけどおそらく動く」ではダメだ。動作試験をするための環境を整えて実際にテストする必要がある。




■いろいろな言語を扱える日本語ソフト
mui02.gif
多言語プログラミングの次のステップは「いろいろな言語の文字入力に対応する」というものだ。

日本語ソフトであってもハングル文字やSimplified Chinese、Traditional Chineseなどの多言語を扱えるようにしておくといい。これらは文字セットとしてユニコードを利用することで比較的簡単に実現できる。




■Windowsに応じてメニューなどの言語が切り替わるソフト
mui04.gif
次は「システムに応じた言語でメニューを表示できる」というものだ。

ソフトを英語版Windowsにインストールするとメニューなどが英語で表示され...

mui03.gif
日本語版Windowsにインストールすると日本語で表示されるように開発する。これは多言語化するための基本的な事柄だ。ここでは「1つの実行ファイルで英語と日本語表示に対応」した例を挙げた。少し実装方法を変えて「1つのソースコードで英語専用の実行ファイルと日本語専用の実行ファイルを作る」ようにすることもある。




■実行時にメニューなどの言語を切り替えれるソフト
mui05.gif
最後は「自由に表示言語を選べる」ものだ。

Windowsが英語版であっても日本語版であっても、メニュー表示やオプション画面から使いたい言語を選択すればその言語での表示に切り替わるようにする。

mui06.gif




ここでは多言語プログラミングをユーザー側の視点から見た区分をいくつか挙げた。しかしこれ以外にもさまざまな目的や用途で違った形の動作をする「多言語ソフト」がある。実装方法もリソースを言語ごとにDLL化したり、一括して管理したりとさまざまなだ。
純粋に日本人向けのソフトに英語や韓国語のメニューを実装しても意味がない。多言語ソフトを開発したい場合はまずは「何のために」多言語化するのかを考えるといいだろう。


プロジェクトファイルをダウンロード

2006年12月10日

日本語/英語リソース日本語版WTL 8.0のアプリケーションウィザード

wtl_jpen.gif
WTLはライセンスがCPLのオープンソースプロジェクトとして公開されている。そのためおそらく勝手に日本語化したものを配布しても問題ないと思い用意しました。ライセンス的に問題があるようでしたらお知らせください。削除します。

mui04.gif
このウイザードを利用するとWindowsに応じてメニューなどの言語が切り替わる実行ファイルを簡単に作れる。

つまり作成した実行ファイルを英語版Windowsで使うとメニューなどが英語で表示され...

mui03.gif
日本語版Windowsでは日本で表示される。メニューやストリングテーブルなどを日本語と英語両方含めたことによる。


■ダウンロード
日本語/英語リソースWTL 8.0をダウンロード

FindFirstUrlCacheEntryで取得できるURLは文字化けの可能性がある

Internet Explorerのキャッシュ情報を取得するAPIとしてFindFirstUrlCacheEntryやFindNextUrlCacheEntryが用意されている。これらのAPIではキャッシュ内に保存されているURL、アクセスした回数などが取得できて便利だ。

しかしなぜかこれらのAPIはバグ?が潜んでいる。下の画像はこれらのAPIによって取得したURLの例だ。これらはどちらもローカルHDD内にアクセスしたときにキャッシュされた情報だが...日本語名のフォルダが完全に文字化けしている(テスト環境:Windows XP SP2)。
通常のインターネットURLの場合は%xx形式でエンコードされるため問題が生じる可能性は低いだろう。しかし「file://」で始まるURLについては要注意だ。


Test56_01.gif


Test56_02.gif

依存環境:ATL
#include "atlstr.h"

#include "wininet.h"
#pragma	comment(lib,"wininet.lib")

bool	Test(void)
{
	HANDLE	hFind;
	DWORD	dwLen;
	INTERNET_CACHE_ENTRY_INFO*	psInfo;

	dwLen = 0;
	hFind = ::FindFirstUrlCacheEntry(_T("visited:"),NULL,&dwLen);
	if(dwLen == 0)
	{
		if(hFind)
			::FindCloseUrlCache(hFind);
		return	false;
	}
	//サイズ取得せずにdwLen = MAX_CACHE_ENTRY_INFO_SIZE;を利用してnewしてもいい
	psInfo = (INTERNET_CACHE_ENTRY_INFO*) new TCHAR[dwLen];
	hFind = ::FindFirstUrlCacheEntry(_T("visited:"),psInfo,&dwLen);

	delete	psInfo;

	while(1)
	{
		BOOL	ret;

		dwLen = 0;
		ret = ::FindNextUrlCacheEntry(hFind,NULL,&dwLen);
		if(dwLen == 0)
			break;

		//MSDNではchar[dwLen]となっているが…誤記かもしれないのでTCHARを利用
		psInfo = (INTERNET_CACHE_ENTRY_INFO*) new TCHAR[dwLen];

		ret = ::FindNextUrlCacheEntry(hFind,psInfo,&dwLen);

		CAtlString	str = psInfo->lpszSourceUrlName;
		if(str.Find(_T("@file://")) > 0)
			::MessageBox(NULL,str,_T(""),MB_OK);
		else if(str.Find(_T("??")) > 0)
			::MessageBox(NULL,str,_T(""),MB_OK);

		delete	psInfo;
	}

	::FindCloseUrlCache(hFind);

	return	true;
}

プロジェクトファイルをダウンロード

前の10件 1  2  3  4  5  6  7  8  9  10





usefullcode@gmail.com

About 2006年12月

2006年12月にブログ「UsefullCode.net」に投稿されたすべてのエントリーです。

前の記事は2006年11月です。

次の記事は2007年01月です。

他にも多くのエントリーがあります。メインページ記事一覧も見てください。