[vbox-dev] takecSreenShot
Valery Portnyagin
valery.portnyagin at oracle.com
Tue May 21 06:31:45 PDT 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