Не удается получить 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);