[vbox-dev] How to get screenshot of a guest OS using COM api?

Klaus Espenlaub Klaus.Espenlaub at Sun.COM
Wed Sep 16 10:56:53 PDT 2009


Grigory Petrov schrieb:
> Hello.
> 
> I'm using VirtualBox to automate old DOS program and need to takes screenshots of guest OS in order to manipulate a program correctly. I have tried the following test code:
> 
> void main( void )
> {
>   ::CoInitialize( 0 );
>   IVirtualBox* poVbox = 0;
>   ::CoCreateInstance( CLSID_VirtualBox, 0, CLSCTX_ALL, IID_IVirtualBox, (void**)& poVbox );
>   SAFEARRAY* poVmList = 0;
>   poVbox->get_Machines( & poVmList );
>   
>   IMachine** ppoVmArray = 0;
>   ::SafeArrayAccessData( poVmList, (void**)& ppoVmArray );
>   BSTR oVmId;
>   (* ppoVmArray)->get_Id( & oVmId );
> 
>   ISession* poSession = 0;
>   HRESULT hRet = ::CoCreateInstance( CLSID_Session, 0, CLSCTX_ALL,
>     IID_ISession, (void**)& poSession );
> 
>   IProgress* poProgress = 0;
>   BSTR oEnvir = ::SysAllocString( L"" );
>   
>   hRet = poVbox->OpenRemoteSession( poSession, oVmId, ::SysAllocString( L"gui" ), oEnvir, & poProgress );
>   // Wait resonable time for VM to start and to display something.
>   ::Sleep( 10000 );
> 
>   IConsole* poConsole = 0;
>   hRet = poSession->get_Console( & poConsole );
>   IDisplay* poDisplay = 0;
>   hRet = poConsole->get_Display( & poDisplay );
>   
>   UINT32 anMem[ 100 ] = { 0 };
>   hRet = poDisplay->TakeScreenShot( (BYTE*)anMem, 10, 10 );
>   assert( SUCCEEDED( hRet ) );
> }
> 
> All works, VirtualBox starts and loads guest OS, but after calling TakeScreenShow() it returns E_NOTIMPL :(. Does anyone know what can i do? Maybe i need to use other API functions, get screen buffer, register for updates notifications or something? Host OS is windows XP SP3, latest VirtualBox and SDK from site. I will be very glad if someone can share an working example on how to take an screenshot / image of guest OS desktop, that will help a lot! Or maybe it's some error in my code?

The error says it all. The code can't deal with scaling, and as you 
request a 10x10 pixel screenshot that'll fail. Make sure you request the 
width and height of the framebuffer (and have enough buffer size 
available for that). An example is in the GUI code, but remember that 
this uses different API wrappers so the calling conventions are a bit 
different than the normal (xp)com API calls.

Klaus




More information about the vbox-dev mailing list