Peter: CGI Script gibt falsche werte zurück

Hallo,

ich bin gerade dabei, ein cgi script mit c zu schreiben, welches mir einen Screenshot vom Desktop erzeugen soll. Solange ich die Befehlzeile benutze, gibt mir GetDeviceCaps() die richtigen Werte zurück (1440x900). Lasse ich den Code jedoch über apache 2.2 laufen, gibt mir GetDeviceCaps immer wieder eine Auflösung von  1024x768 zurück.

Woran liegt das und wie berichtige ich das? Hoffe ihr könnt mir helfen....

  1. Hi,

    ich bin gerade dabei, ein cgi script mit c zu schreiben, welches mir einen Screenshot vom Desktop erzeugen soll. Solange ich die Befehlzeile benutze, gibt mir GetDeviceCaps() die richtigen Werte zurück (1440x900). Lasse ich den Code jedoch über apache 2.2 laufen, gibt mir GetDeviceCaps immer wieder eine Auflösung von  1024x768 zurück.

    Laufen beide Sachen denn auf dem selben (ggf. virtuellen) Desktop ab ...?

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hi,

      ich bin gerade dabei, ein cgi script mit c zu schreiben, welches mir einen Screenshot vom Desktop erzeugen soll. Solange ich die Befehlzeile benutze, gibt mir GetDeviceCaps() die richtigen Werte zurück (1440x900). Lasse ich den Code jedoch über apache 2.2 laufen, gibt mir GetDeviceCaps immer wieder eine Auflösung von  1024x768 zurück.

      Laufen beide Sachen denn auf dem selben (ggf. virtuellen) Desktop ab ...?

      MfG ChrisB

      Jupp tun sie, nur dass ichs statt direkt aus dem IE oder Opera starten will... wenns hilft der Quellcode:

      void takesshot()
      {
          HWND    hWnd    = GetDesktopWindow();
          HDC     hdc     = GetDC(hWnd);
          HDC     memDC   = CreateCompatibleDC(hdc);
          HBITMAP hbm     = CreateCompatibleBitmap(hdc, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES));
          HBITMAP hbmOld  = (HBITMAP)SelectObject(memDC, hbm);

      printf("<BR>Resolution: %dx%dx%d", GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES), GetDeviceCaps(hdc, BITSPIXEL));

      BITMAPINFO bmi;

      ZeroMemory(&bmi, sizeof(bmi));

      bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
          bmi.bmiHeader.biWidth        = GetDeviceCaps(hdc, HORZRES);
          bmi.bmiHeader.biHeight       = GetDeviceCaps(hdc, VERTRES);
          bmi.bmiHeader.biBitCount     = GetDeviceCaps(hdc, BITSPIXEL);
          bmi.bmiHeader.biPlanes       = 1;
          bmi.bmiHeader.biCompression  = BI_RGB;
          bmi.bmiHeader.biSizeImage    = bmi.bmiHeader.biBitCount * GetDeviceCaps(hdc, HORZRES) * GetDeviceCaps(hdc, VERTRES) / 8;

      byte *pbBits = malloc(bmi.bmiHeader.biSizeImage);

      BitBlt(memDC, 0, 0, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES), hdc, 0, 0, SRCCOPY);

      if(GetDIBits( memDC,
                       hbm,
                       0,
                       bmi.bmiHeader.biHeight,
                       pbBits,
                       &bmi,
                       DIB_RGB_COLORS ))
              printf("<BR>GetDIBits successfully....");
              else
              printf("<BR>GetDIBits failed....");

      BITMAPFILEHEADER bfh;

      bfh.bfType      = ('M' << 8) + 'B';
          bfh.bfSize      = sizeof(BITMAPFILEHEADER)  +
                            bmi.bmiHeader.biSizeImage +
                            sizeof(BITMAPINFOHEADER);
          bfh.bfReserved1 = 0;
          bfh.bfReserved2 = 0;
          bfh.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

      HANDLE hfile = CreateFile( "screen.bmp",
                                     GENERIC_WRITE,
                                     0,
                                     0,
                                     OPEN_ALWAYS,
                                     0,
                                     0 );

      DWORD dwWritten;

      WriteFile(hfile,&bfh,           sizeof(bfh),               &dwWritten, NULL);
          WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER),  &dwWritten, NULL);
          WriteFile(hfile, pbBits,         bmi.bmiHeader.biSizeImage, &dwWritten, NULL);

      CloseHandle(hfile);

      SelectObject(memDC, hbmOld);
          DeleteDC(memDC);
          ReleaseDC(hWnd,hdc);
          DeleteObject(hbm);
      }