Virtual Serverのサムネイル取得→C#で表示

ついこの間IE7を再インストールしたら、Virtual Serverの管理画面やVMの仮想画面にブラウザでアクセスする際にパスワードの保存にチェックを付けているにもかかわらず毎回パスワードを聞かれるようになり、それが死ぬほどイライラするためVirtual Serverが提供しているCOMのインターフェース経由でせめてサーバの状態確認&サーバのON/OFF程度が出来るユーティリティでも作ろうかと思い立ちC#でなんとなく作ってみたのだが、そこで止めておけば良いのに色気を出してVMのディスプレイのサムネイルを取得できるAPIを使ってユーティリティ上にサーバのちっさい画面も表示できるようにがんばってみたところ、表示できるようにはなったのだがイライラして死ぬかと思うほど大変だった。止めておけばよかった。


以下、Virtual Server 2005 R2のCOM APIで取得した仮想マシンの画面サムネールをC#でPictureBoxに貼り付けるコードの抜粋。


using Microsoft.VirtualServer.Interop;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

...

uint[] thm = new uint[64*48];
virtualMachine.Display._GenerateThumbnail(thm);

int[] thmi = new int[64*48];
for (int i = 0; i < 64 * 48; i++)
{
uint pr = (thm[i] & 0x00FF0000) >> 8;
uint pg = (thm[i] & 0x0000FF00) << 8;
uint pb = (thm[i] & 0xFF000000) >> 24;
thmi[i] = (int)(pr | pg | pb);
}

Bitmap bmp = new Bitmap(64, 48, PixelFormat.Format32bppRgb);
BitmapData bd
= bmp.LockBits(new Rectangle(0, 0, 64, 48),
ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb);
Marshal.Copy(thmi, 0, bd.Scan0, 64 * 48);
bmp.UnlockBits(bd);

Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
g.DrawImage(bmp, 0, 0, 64, 48);


上記中、virtualMachineがIVMVirtualMachineのオブジェクト。
Virtual Serverから取得できるサムネールのピクセルの色の並びが{BRG?}なのに対して、C#のPixelFormat.Format32bppRgbであるBITMAPの色の並びは{?GRB}らしい。