Microsoft Visual C++ Toolkit 2003
Microsoft Visual C++ Toolkit 2003が、(無料)配布されています。
これに含まれているコンパイラは、VisualStudio.NET2003と同等の最適化機能が付いている物らしいです。正確には、VS.NET2003付属コンパイラより、リビジョンは小さく(古い?)、生成されるバイナリも異なるようなので、全く同じ物では無いようです。また、VC++ Toolkitには、コンパイラやリンカなどはありますが、MFCやSDKは含まれていませんので、ご注意。
ということで、あとは、PlatformSDKとか、.NET Framework SDKをダウンして、デバッカとしてWinDBGをダウンすれば、C/C++/C#限定だけどMS製な無料Windows開発環境が出来上がるのかな?もしかして、VS.NET 2003いらない?MFCが必要ならVS買うしかないかもだけど、MFC使えないから無くても問題ないし。
さらに、IDEにEclipse使えば完璧?
Eclipse使ったこと無いので、他のツールとの連携が可能かどうかは不明。SDKやVC++ Toolkitは問題無さそうだけど、WinDBGはどうだろう。WinDBGって結構強力なデバッカで、使いこなせるなら悪くないと思う。ドライバ類のデバックには手放せないし。Eclipseと組めるなら、VSマジでいらないかも?…。
VSエディタの範囲指定キーをカスタマイズ
VisualStudio.NETを使う上で気になることが一つ。
たぶんそう感じてる人が多いと思うのが、VSエディタのキー操作性。
今使っているVS.NETは、昔のVSエディタに比べると色々と細かいところまでキーカスタマイズ出来るようになったのですが、どうしても範囲指定のキーだけはカスタマイズ出来ないようで(もしかしたら、私が知らないだけかもしれませんが)、困っています。Windows標準(メモ帳互換)な、SHIFTキーとカーソルキーで範囲指定し、Ctrl+CやCtrl+XそしてCtrl+Vを組み合わせる操作方法しか受け付けてくれません。
私の好みは、ファクションキーで選択開始を指定出来る操作方法。これは、DOSの頃に使用したエディタ(RED。たぶんMIFES互換)の操作方法で、この操作方法以外ではコーディングできない体になってしまっています(慣れの問題だという話もありますが…)。どうしてもアメリカンなWindows標準のキー操作に馴染めず、いままでVS上でコーディングすることは極力避け、自分好みにキーカスタマイズした秀丸エディタを使ってのみ、コーディングしていました。そういえば、DOS->Win3.1の頃って、そこまでキーカスタマイズ出来るエディタって秀丸くらいしかなかったよなぁ。重宝してます。
今までは、これでも良かったのですが、VS.NETでC#なる物を使う事を考えた場合、VS.NET上でコーディングしたほうが、入力支援や各種ヘルプ等を使用できてラクチンになりそうです。しかし、どうしてもWindows標準な範囲指定のキー操作に馴染めず、途中でイライラしちゃいます。このままでは、開発効率も落ちますし、ストレスがたまります(毎回「MSのアホ〜」とかツブやいてます(--;)。
たぶん、私以外にも同じような不満を持っている人がいて、既にVS上の範囲指定キーをカスタマイズ出来るツールを作っている人がいるだろうと、ネットを探してみたのですが、(VS関係なく)単純なキーマップの変更とかはあるのですが(それってレジストリ操作するだけで実現出来るヤツじゃん…)、求める機能を実現してくれるツールは見つけられません。MIFES互換なキー操作だから、需要あると思ったんだけどなぁ…。
しかたないので、無ければ自分でなんとかするしかないか、と、作り始め。フックすればいいだけだから簡単だろうと思ってたら、これがめちゃくちゃ面倒。メモ帳君レベルなら騙すの簡単なのですが、どうもVSはそう単純では無い模様…。何度もPeekMessage(PM_NOREMOVE)してくるなよ>VS(--; おかげで、出来上がったプログラムは、フラグだらけ…。恐い恐い。SetWindowsHookEx()なんて中途半端な事は止めて、フィルタードライバ作っちゃったほうが早かったと後悔。それはヒマな時でいいか…。
さて、出来上がったのはいいのだけど、やはり秀丸エディタの操作性には遠く及びません。範囲指定その物のキーはカスタマイズ出来たけど、範囲指定と他のキー操作の組合せ(例えば、範囲指定したまま検索とか)が出来ないと、ダメだよねぇ。MS社内の人はこれで満足してるんだろうか?それとも何か他の方法があるのかなぁ?????
パフォーマンスの取得
システムモニタや、タスクマネージャの「プロセス」タブ等で、表示される「CPU使用率」とか「メモリ使用量」とかを所得する方法のメモ。
PDH系APIを使用します。ただし、これはNT系のみでの動作。たしか95系はレジストリに値が記録されていたと記憶…。たしか、昔MSDNLibraryかなにかでPDHの記事があったような記憶あるけど、忘れてしまったのでサンプル作って動作確認。で、何に使うかは不明(^_^;
#include <windows.h> #include <stdio.h> #include <pdh.h>void main()
{
HQUERY hQuery;
HCOUNTER hCounter;
PDH_COUNTER_PATH_ELEMENTS cpe;
char path[256];
DWORD size = 256;
PDH_FMT_COUNTERVALUE FmtValue;
//クエリー作成
PdhOpenQuery(NULL, 0, &hQuery);
//所得したい情報(カウンタ)のパスを作成
//例として、メモ帳のCPU使用率
//ObjectNameやCounterNameで指定する名称は、
//PdhEnumObjects()でオブジェクトの列挙
//PdhEnumObjectItems()でカウンタの列挙が出来る
//決めうちなら、システムモニタの「カウンタの追加」を参照
cpe.szMachineName = NULL;
cpe.szObjectName = "Process";
cpe.szInstanceName = "notepad";
cpe.szParentInstance = NULL;
cpe.dwInstanceIndex = 0;
cpe.szCounterName = "% Processor Time";
PdhMakeCounterPath(&cpe, path, &size, 0);
//カウンタをクエリーに追加
PdhAddCounter(hQuery, path, 0, &hCounter);
#if 1
//値取得
PdhCollectQueryData(hQuery);
//10秒間待つ
Sleep(10000);
//値取得
PdhCollectQueryData(hQuery);
#else
//こちらでもよいが、NT4では動かない
PdhCollectQueryDataEx(hQuery, 10, NULL);
#endif
//10秒間のメモ帳のCPUの使用率を取得
PdhGetFormattedCounterValue(hCounter, PDH_FMT_DOUBLE, NULL, &FmtValue);
printf("メモ帳のCPU使用率: %f%%\n", FmtValue.doubleValue);
//終了
PdhCloseQuery(hQuery);
}
追記:.NETでのパフォーマンスカウンタ fromMSDN
こちらはちゃんと日本訳されてます。Longhornを見据えて、そろそろクライアントアプリも.NETで開発してよいのかも。ただ現状では、.NET Frameworkが別配布&重いのが難点だけど…。