Не удается получить IP-адрес компьютера VirtualBox с помощью API VBox

У меня есть машина VirtualBox с Ubuntu, к которой подключен мостовой адаптер.

То, что я пытаюсь сделать, это получить IP-адрес машины.

Если я запускаю машину вручную и использую утилиту VBoxManage, например:

VBoxManage guestproperty get "Ubuntu Test Machine" /VirtualBox/GuestInfo/Net/0/V4/IP

все работает нормально

Тем не менее, мне нужно получить IP программно, используя VBox SDK. Вот самая важная часть кода (в конце я опубликую весь код ниже):

HRESULT hr = machine->GetGuestPropertyValue(L"/VirtualBox/GuestInfo/Net/0/V4/IP", &ip);
if (SUCCEEDED(hr))
{
    printf("The machine's IP is: %s", ip);
}
else
    printf("Error retrieving machine IP! rc = 0x%x\n", hr);

Я получаю следующую ошибку:

Error retrieving machine IP! rc = 0x80070057

Видимо, этот код ошибки означает недопустимый параметр.

Может кто-нибудь сказать мне, что не так с этим параметром? Или если я делаю что-то еще не так?

Вот весь код (в основном это пример кода из каталога примеров VBox SDK с несколькими изменениями):

int testStartVM(IVirtualBox *virtualBox)
{
    HRESULT rc;

    IMachine *machine = NULL;
    BSTR machineName = SysAllocString(L"Ubuntu Test Machine");

    rc = virtualBox->FindMachine(machineName, &machine);

    if (FAILED(rc))
    {
        // this code is verbose and not relevant
    }
    else
    {
        ISession *session = NULL;
        IConsole *console = NULL;
        IProgress *progress = NULL;
        BSTR sessiontype = SysAllocString(L"headless");
        BSTR guid;

        do
        {
            rc = machine->get_Id(&guid); /* Get the GUID of the machine. */
            if (!SUCCEEDED(rc))
            {
                printf("Error retrieving machine ID! rc = 0x%x\n", rc);
                break;
            }

            /* Create the session object. */
            rc = CoCreateInstance(CLSID_Session,        /* the VirtualBox base object */
                                  NULL,                 /* no aggregation */
                                  CLSCTX_INPROC_SERVER, /* the object lives in a server process on this machine */
                                  IID_ISession,         /* IID of the interface */
                                  (void**)&session);
            if (!SUCCEEDED(rc))
            {
                printf("Error creating Session instance! rc = 0x%x\n", rc);
                break;
            }

            /* Start a VM session using the delivered VBox GUI. */
            rc = machine->LaunchVMProcess(session, sessiontype,
                                          NULL, &progress);
            if (!SUCCEEDED(rc))
            {
                printf("Could not open remote session! rc = 0x%x\n", rc);
                break;
            }

            /* Wait until VM is running. */
            printf("Starting VM, please wait ...\n");
            rc = progress->WaitForCompletion(-1);

            /* Get console object. */
            session->get_Console(&console);

            /* Bring console window to front. */
            machine->ShowConsoleWindow(0);

            // give it a few seconds just to be sure everything has been started
            Sleep(40 * 1000);
            BSTR ip;

            **// this line fails**
            HRESULT hr = machine->GetGuestPropertyValue(L"/VirtualBox/GuestInfo/Net/0/V4/IP", &ip);
            if (SUCCEEDED(hr))
            {
                printf("The machine's IP is: %s", ip);
            }
            else
                printf("Error retrieving machine IP! rc = 0x%x\n", hr);

            printf("Press enter to power off VM and close the session...\n");
            getchar();

            /* Power down the machine. */
            rc = console->PowerDown(&progress);

            /* Wait until VM is powered down. */
            printf("Powering off VM, please wait ...\n");
            rc = progress->WaitForCompletion(-1);

            /* Close the session. */
            rc = session->UnlockMachine();

        } while (0);

        SAFE_RELEASE(console);
        SAFE_RELEASE(progress);
        SAFE_RELEASE(session);
        SysFreeString(guid);
        SysFreeString(sessiontype);
        SAFE_RELEASE(machine);
    }

    SysFreeString(machineName);

    return 0;
}


int main(int argc, char *argv[])
{
    HRESULT rc;
    IVirtualBox *virtualBox;

    /* Initialize the COM subsystem. */
    CoInitialize(NULL);

    /* Instantiate the VirtualBox root object. */
    rc = CoCreateInstance(CLSID_VirtualBox,       /* the VirtualBox base object */
                            NULL,                   /* no aggregation */
                            CLSCTX_LOCAL_SERVER,    /* the object lives in a server process on this machine */
                            IID_IVirtualBox,        /* IID of the interface */
                            (void**)&virtualBox);

    if (!SUCCEEDED(rc))
    {
        printf("Error creating VirtualBox instance! rc = 0x%x\n", rc);
        return 1;
    }

    listVMs(virtualBox);

    testStartVM(virtualBox);

    /* Release the VirtualBox object. */
    virtualBox->Release();

    CoUninitialize();

    getchar();
    return 0;
}

1 ответ

Решение

Я нашел проблему. Видимо, функция GetGuestPropertyValue не знает, как автоматически конвертировать wchar_t* в BSTR. Мне нужно дать ему фактический BSTR.

Вот правильный путь:

BSTR val = SysAllocString(L"/VirtualBox/GuestInfo/Net/0/V4/IP");

HRESULT hr = machine->GetGuestPropertyValue(val, &ip);
if (SUCCEEDED(hr))
{
    wprintf(L"The machine's IP is: %s", ip);
}
else
    printf("Error retrieving machine IP! rc = 0x%x\n", hr);

SysFreeString(val);
Другие вопросы по тегам