概要

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