[vbox-dev] takecSreenShot

Valery Portnyagin valery.portnyagin at oracle.com
Tue May 21 13:31:45 GMT 2013


On 05/21/2013 04:45 PM, Klaus Espenlaub wrote:
> Hi,
>
> On 20.05.2013 11:50, 一生有你 wrote:
>> I tried to take a screen shot by takecSreenShot(),,but everytime when i
>> trys it, display->TakeScreenShot fails,,and VisualBox.exe crashes....
>> I am sure that I can get the correct width and height of the screen
>> "printf("Width: %ul Height: %ul Bits Per Pixel: %ul. ",
>> width,height,bpp);"......
>> my vbox and SDK version are the same 4.1.6....
>> please help me ...thank U!!
> The cause of this is simple (and the crash is the expected symptom of
> this misuse of the API): you're using an API which only works within the
> VM process from outside the VM process.
>
> The API documentation clearly says "Note: This API can be used only
> locally by a VM process through the COM/XPCOM C++ API as it requires
> pointer support. It is not available for scripting langages, Java or any
> webservice clients. Unless you are writing a new VM frontend use
> takeScreenShotToArray.", and ignoring this is lethal.
>
> The SDK comes with documentation, and there's also the online version:
> https://www.virtualbox.org/sdkref
>
> The description of the used API method is at
> https://www.virtualbox.org/sdkref/interface_i_display.html#a6a5c4f84adbe7ce8ffb5ebefe4f835ec
> and warns twice against your attempt to misuse it.
>
> Additionally you ignored the fact that it always returns the screenshot
> with 32bpp, no matter what the current VM framebuffer bpp is.
>
> Klaus
>
>> ///////here is the code..........bellow
>> int testTakeScreenShot(ISession *session)
>> {
>>       IConsole *console = NULL;
>>       IDisplay *display = NULL;
>>       IFramebuffer* fb=NULL;
>>       unsigned long width, height, bpp;
>>       SIZE_T buffersize;
>>       BYTE* databuff;
>>       HRESULT rc;
>>       if (session == NULL)
>>         return 1;
>>     /* Get console object. */
>>       rc=session->get_Console(&console);
>>       rc=console->get_Display(&display);
>>       display->GetScreenResolution(0,&width,&height,&bpp);
>>       printf("Width: %ul Height: %ul Bits Per Pixel: %ul. ",
>> width,height,bpp);
>>       buffersize = width*height*bpp/8;
>>       databuff= (BYTE*)CoTaskMemAlloc(buffersize);
>>       printf("%p\n", databuff);
>>
>>     // Test databuffer
>>     if (databuff != NULL)
>>     {
>>      rc = display->TakeScreenShot(0,databuff,width,height);
>>      if (SUCCEEDED(rc))
>>      {
>>       printf("Took a screenshot! %d\n", rc);
>>      }
>>      else
>>      {
>>       printf("Error taking screen shot! rc = 0x%x\n", rc);
>>      }
>>      CoTaskMemFree(databuff);
>>     }
>>    return 0;
>> }
> _______________________________________________
> vbox-dev mailing list
> vbox-dev at virtualbox.org
> https://www.virtualbox.org/mailman/listinfo/vbox-dev

and there is another function TakeScreenShotToArray. try to use it.

-- 
Valery Portnyagin | VirtualBox Developer | (+7 812) 334 64 26
Oracle Development SPB
10th Krasnoarmeyskaya 22A, Saint-Petersburg, 190103, Russia





More information about the vbox-dev mailing list