山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他VirtualBox仮想マシン名の一覧を取得
概要
VirtualBoxの仮想マシン名の一覧を取得しコンボボックスに表示します。
テスト環境
コンパイラ
Visual C++ 2008 Standard 32/64bitVisual C++ 2013 Express 32/64bit
プロジェクトの作成
Win32プロジェクト Windowsアプリケーション実行環境
Windows 8.1 Enterprise 64bitWindows 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
}
ソースファイルと実行ファイルのダウンロード
Copyright (C) 2012 山本ワールド All Rights Reserved.