概要

VirtualBoxの仮想マシン名の一覧を取得しコンボボックスに表示します。

テスト環境

コンパイラ

Visual C++ 2008 Standard 32/64bit
Visual C++ 2013 Express 32/64bit

プロジェクトの作成

Win32プロジェクト Windowsアプリケーション

実行環境

Windows 8.1 Enterprise 64bit
Windows 7 EnterPrise Service Pack 1 64bit
Windows Vista Ultimate Service Pack 2 32bit
Windows XP Professional Service Pack 3 32bit

プログラムソースの概要

getvbox.cpp

_tWinMain

仮想マシーン名を取得するダイアログを表示します。
仮想マシーン名が取得できた場合はメッセージボックスで仮想マシーン名を表示します。

GetVmDlgProc

仮想マシーン名を取得するダイアログボックスプロシージャーです。
WM_INITDIALOG
このダイアログを表示するときに使用した、DialogBoxParam APIで指定したLPARAMを取り出してスタティック変数vm_nameに保存しておきます。vm_nameに取得された仮想マシーン名が保存されます。
SHGetSpecialFolderPath APIによりユーザープロフィールのフォルダー名を取得します。
このAPIはWindows 2000以上で使用可能です。Windows 2000で使用できる実行ファイルはVisual C++ 2005で作成可能なので、Visual C++ 97でビルドした場合は、Windows 9x系の実行ファイルをビルドしているとみなし、このAPIを無視するようにします。
VirtualBoxの仮想マシンの設定ファイルは、ユーザープロフィールの中のVirtualBox VMsフォルダーに仮想マシンごとにフォルダーが作成されています。
FindFirstFile,FindNextFile APIによりVirtualBox VMsフォルダーの中のフォルダーを検索します。自分自身のフォルダーを示す.と親フォルダーを示す..を無視するようにします。
見つかったフォルダー名は、CB_INSERTSTRINGメッセージによりコンボボックスに登録します。
コンボボックスのスタイルには、CBS_DROPDOWNを指定していますので、コンボボックスに登録されていない場合、直接編集して作成することが可能です。
リストボックスにアイテムが登録されている場合は、CB_SETCURSELメッセージにより0個目のアイテムを選択状態にします。
WM_COMMAND
IDOK
GetWindowText APIにより選択されているアイテムまたは、編集されたアイテムをスタティック変数vm_nameに取得します。 EndDialog APIによりダイアログボックスを終了させます。
IDCANCEL
閉じるボタンのクリックおよびESCキーを押したときに呼び出されます。
EndDialog APIによりダイアログボックスを終了させます。

プログラムソース

getvbox.cpp

//	Oracle VM VirtualBoxのマシーン名の取得
//	Visual C++ 2008/2013

#include <windows.h>
#include <shlobj.h>
#include <commctrl.h>
#include <tchar.h>
#include "resource.h"

#if _MSC_VER<=1100
	#define _tcscat_s(dtc,sz,src) _tcscat(dtc,src)
#endif

//	仮想マシーン名を取得するダイアログボックスプロシージャー
LRESULT CALLBACK GetVmDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI _tWinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, TCHAR* lpsCmdLine, int nCmdShow){
	TCHAR name[MAX_PATH];
	if (DialogBoxParam(hCurInst, TEXT("GetVmDLG1"), 0, (DLGPROC)GetVmDlgProc, (LPARAM)name) == TRUE)
		MessageBox(0, name, _TEXT("仮想マシーン名"), MB_OK);
	return (int)0;
}


//	仮想マシーン名を取得するダイアログボックスプロシージャー

LRESULT CALLBACK GetVmDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
	static TCHAR* vm_name = 0;
	int num;
	switch (msg) {
	case WM_INITDIALOG:{
		vm_name = (TCHAR*)lParam;
		num = 0;
#if 1100<_MSC_VER
		TCHAR path[MAX_PATH];
		if (SHGetSpecialFolderPath(NULL, path, CSIDL_PROFILE, 0) == TRUE){
			_tcscat_s(path, sizeof(path) / sizeof(TCHAR), _TEXT("¥¥VirtualBox VMs¥¥*.*"));
			WIN32_FIND_DATA FindFileData;
			HANDLE hFind;

			hFind = FindFirstFile(path, &FindFileData);
			if (hFind != INVALID_HANDLE_VALUE){
				do{
					if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
						if (_tcscmp(FindFileData.cFileName, _TEXT(".")) && _tcscmp(FindFileData.cFileName, _TEXT(".."))){
							SendMessage(GetDlgItem(hDlg, IDC_COMBOBOX), CB_INSERTSTRING, num, (LPARAM)FindFileData.cFileName);	//コンボボックスにアイテムの設定
							++num;
						}
					}
				} while (FindNextFile(hFind, &FindFileData));
				FindClose(hFind);
			}
		}
#endif
		if (num==0){	//	仮想マシーンが存在しない場合
			EndDialog(hDlg, FALSE);
		}else{
			SetWindowText(GetDlgItem(hDlg, IDC_LABEL), _TEXT("仮想マシーンを選択してください。"));
			SendMessage(GetDlgItem(hDlg, IDC_COMBOBOX), CB_SETCURSEL, 0, (LPARAM)0);	//	初期時に選択されるアイテムを選択
		}
		return TRUE;
	}
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDOK:
			GetWindowText(GetDlgItem(hDlg, IDC_COMBOBOX), vm_name, MAX_PATH);
			EndDialog(hDlg, TRUE);
			return TRUE;
		case IDCANCEL:
			EndDialog(hDlg, FALSE);
			return FALSE;
		default:
			return FALSE;
		}
	default:
		return FALSE;
	}
	return TRUE;
}

resource.h

#define IDC_COMBOBOX 100
#define IDC_LABEL	110

resource.rc

#include <windows.h>
#include "resource.h"

GetVmDLG1 DIALOG DISCARDABLE 0, 0, 134, 85
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP  | WS_CAPTION | WS_SYSMENU |  DS_SETFONT
CAPTION "VirtualBox仮想マシン名取得"
FONT 9, "MS 明朝"
{
 LTEXT	"", IDC_LABEL, 7, 7, 120, 24
	 CONTROL "", IDC_COMBOBOX, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, 7, 38, 120, 100
 
 CONTROL "OK", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 8, 64, 54, 14
 CONTROL "キャンセル", IDCANCEL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 72, 64, 54, 14
}

ソースファイルと実行ファイルのダウンロード

ダウンロード getvbox.zip(37.9k)
getvbox.cpp
resource.h
resource.rc