Ошибка восстановления снимка виртуальной машины в Virtual Box - PullRequest
0 голосов
/ 26 апреля 2019

Я использую VirtualBox и Virtual Box API Microsoft Com C ++ для своего проекта. Это пакеты разработчика программного обеспечения VirtualBox 6.0.6 (SDK) и платформы VirtualBox 6.0.6.
У меня проблема. Я хочу восстановить систему моментальных снимков, которая была создана ранее, но программа показывает ошибки.
Мой код с комментариями:

HRESULT rc; 

IVirtualBoxClient *virtualBoxClient = nullptr; 
IVirtualBox *virtualBox = nullptr; 
IMachine *machine = nullptr; 
ISession *session = nullptr; 
IProgress *progress = nullptr; 
ISnapshot* snapshot = nullptr; 

BSTR sessiontype = SysAllocString(L"gui"); 
BSTR machineName = SysAllocString(L"Win7x64"); 


HRESULT rc = CoCreateInstance(CLSID_VirtualBoxClient, NULL, CLSCTX_INPROC_SERVER, IID_IVirtualBoxClient, (void**)&virtualBoxClient); 

rc = virtualBoxClient->get_VirtualBox(&virtualBox); 

// looking for a machine with a name Win7x64 
rc = virtualBox->FindMachine(machineName, &machine); 

// create a session object 
rc = CoCreateInstance(CLSID_Session, NULL, CLSCTX_INPROC_SERVER, IID_ISession, (void**)&session); 
if (!SUCCEEDED(rc)) 
{ 
printf("Error creating Session instance! rc = 0x%x\n", rc); 
break; 
} 

// block the machine 
machine->LockMachine(session, LockType::LockType_Shared); 

// the name of the snapshot system 
BSTR snapshotUUID = SysAllocString(L"Win7_test_snapshot"); 
// looking for a snapshot system 
rc = machine->FindSnapshot(snapshotUUID, &snapshot); 
// recover snapshot. ERROR: variable rc - E_NOTIMPL Not implemented. 
rc = machine->RestoreSnapshot(snapshot, &progress); 

printf("Starting VM, please wait ...\n"); 
//waiting for the end of the operation. Abnormal termination- progress == nullptr ! 
rc = progress->WaitForCompletion(-1); 
// unlocking the machine 
rc = session->UnlockMachine(); 
if (!SUCCEEDED(rc)) 
{ 
printf("Error restore state machine!\n"); 
break; 
}

Кроме того, я создал простое приложение на C # и получил точно такую ​​же ошибку. В чем дело? Это ошибка API? Я даже много раз менял ОС (виртуальную):

  static void Main(string[] args)
    {
        VirtualBox.VirtualBox virtualBox = new VirtualBox.VirtualBox();
        IMachine vmMachine = virtualBox.FindMachine("Win7x64VB");
        Session session = new Session();
        vmMachine.LockMachine(session, LockType.LockType_Shared);
        IConsole console = session.Console;

        // Restore snapshot
        ISnapshot snapShot = vmMachine.FindSnapshot("Win7_snapshot1");

        IProgress snapShotProgress = vmMachine.RestoreSnapshot(snapShot);
        snapShotProgress.WaitForCompletion(300000);

        // unlock before launch VMProcess
        session.UnlockMachine();

        IProgress launchVmProgess = vmMachine.LaunchVMProcess(session, "gui", "None");

        launchVmProgess.WaitForCompletion(300000);
    }

enter image description here

Можете ли вы помочь мне, как исправить ошибку метода вызова «RestoreSnapshot - E_NOTIMPL не реализовано» или как правильно восстановить снимок системы? Спасибо.

П.С .: Я задал этот вопрос на официальном форуме, но мне никто не помогает.

1 Ответ

0 голосов
/ 01 мая 2019

Я нашел решение проблемы. Снимок должен быть восстановлен в системе, которая является текущей для сеанса. Поэтому код будет следующим:

HRESULT rc = machine->LockMachine(session, LockType::LockType_Shared);
rc = machine->FindSnapshot(snapshotUUID, &snapshot);
IMachine* currentMachine(nullptr);
rc = session->get_Machine(&currentMachine);
rc = currentMachine->RestoreSnapshot(snapshot, &progress);
rc = progress->WaitForCompletion(300000);
rc = session->UnlockMachine();

Работает с этим кодом.

...