Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

[c,winapi]-Access voliation reading location i problem z BITMAPFILEHEADER

#1
[c,winapi]-Access voliation reading location i problem z BITMAPFILEHEADER
Witam!
Napisałem taki prosty kod:
Kod:
HWND window;
    HANDLE f;
    HDC _dc, dc, ddd, dc2;
    RECT re;
    int w, h;
    void *buf;
    HBITMAP bm;
    DWORD r;
    tagBITMAPINFO bi;
    BITMAPFILEHEADER bif;
    BITMAPINFOHEADER bii;
    window = GetDesktopWindow();
    _dc = GetWindowDC(window);
    GetWindowRect(window,&re);
    w = re.right, h = re.bottom;
    dc = CreateCompatibleDC(0);
    bm = CreateCompatibleBitmap(_dc,w,h);
    SelectObject(dc,bm);
    StretchBlt(dc,0,0,w,h,_dc,0,0,w,h,SRCCOPY);
    buf = malloc(w*h*4+300);
    GetObject(bm,84,buf);
    ddd = GetDC(0);
    dc2 = CreateCompatibleDC(ddd);

    bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
    bi.bmiHeader.biWidth = w;
    bi.bmiHeader.biHeight = h;
    bi.bmiHeader.biPlanes = 1;
    bi.bmiHeader.biBitCount = 32;
    bi.bmiHeader.biCompression = 0;
    bi.bmiHeader.biSizeImage = 0;
    CreateDIBSection(dc,&bi,DIB_RGB_COLORS,&buf,0,0);
    GetDIBits(dc,bm,0,h,buf,&bi,DIB_RGB_COLORS);

    bif.bfType = MAKEWORD('B','M');
    bif.bfSize = w*h*4+54;
    bif.bfOffBits = 54;

    bii.biSize = 40;
    bii.biWidth = w;
    bii.biHeight = h;
    bii.biPlanes = 1;
    bii.biBitCount = 32;
    bii.biCompression = 0;
    bii.biSizeImage = w*h*4;

    f = CreateFile(L"plik.bmp",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,0);
    WriteFile(f,&bif,sizeof(bif),&r,NULL);
    WriteFile(f,&bii,sizeof(bii),&r,NULL);
    WriteFile(f,buf,w*h*4,&r,NULL);
    CloseHandle(f);
    free(buf);
Jeżeli ustawię C w Visual C++ 2008 to wyskakują takie błędy:
error C2065: 'tagBITMAPINFO' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'bi'
error C2224: left of '.bmiHeader' must have struct/union type
(....)
Jest tego aż 49 i nie będę kopiował wszystkiego.
Gdy przełączę język na C++ to kompiluje się bez błędu ale w okienku output po wyłączeniu trybu debugowania pojawia się coś takiego:
First-chance exception at 0x7c26df51 in ahmed.exe: 0xC0000004: Access violation reading location 0x00ddfff7.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#2
RE: [c,winapi]-Access voliation reading location i problem z BITMAPFILEHEADER
A powrzucałeś windows.h w includach i inne potrzebne?
Jak możesz to daj cały kod.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#3
RE: [c,winapi]-Access voliation reading location i problem z BITMAPFILEHEADER
Atup
Cały kod to zawiera oprócz tego int main() { } i #include <Windows.h>
 System operacyjny: windows_seven Przeglądarka: firefox
#4
RE: [c,winapi]-Access voliation reading location i problem z BITMAPFILEHEADER
Na Windowsowskich sposobach robienia screenshootów się zbytnio nie znam, ale zauważyłem że do dwóch funkcji:

Kod:
CreateDIBSection(dc,&bi,DIB_RGB_COLORS,&buf,0,0);
GetDIBits(dc,bm,0,h,buf,&bi,DIB_RGB_COLORS);

Używasz jako output ten sam bufor - buf, linijka która powodowała crash to free(buf) czyli przy zwalnianiu pamięci się rozjeżdżał, po przeszukania internetu zauważyłem, że funckja:

Kod:
CreateDIBSection
jest niepotrzebna więc ją wywaliłem i zostawiłem samo GetDIBits i program już się nie wywalał przy free, a screenshot dalej wykonuje się poprawnie.


Chciałbym tylko zaznaczyć, że to z CreateDIBSection to są tylko moje szybkie spekulacje i może być kompletnie na odwrót, ale u mnie działa to bez problemu bez tej funkcji.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
Programy: Polecane / Nowe / Inne




Podobne wątki ([c,winapi]-Access voliation reading location i problem z BITMAPFILEHEADER)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
Scared [MS Access] Tworzenie kwerend Cixi 2 7553 12.01.2016, 13:24
Ostatni post: Cixi
  [C++ WinAPI] Kompresja bitmapy kikiw 0 5374 25.12.2014, 16:15
Ostatni post: kikiw
  winapi-taki sam tekst w kolejnych zakładkach sfx 0 3193 27.07.2014, 20:28
Ostatni post: sfx

Skocz do:


Wybrane wątki ([c,winapi]-Access voliation reading location i problem z BITMAPFILEHEADER)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Programowanie Batch (CMD) Informatyk2019 0 11841 11.12.2019 18:30
Ostatni post: Informatyk2019
  [JavaScript] Znajdowanie przedziału czasu rafal12999 0 5124 10.12.2019 17:58
Ostatni post: rafal12999
  Przekazywanie wskaźnika przez referencję w Qt Trojan3000 3 19734 10.12.2019 13:16
Ostatni post: Ajgor
  Proszę o pomoc w uzupełnieniu ankiety dt. Zawodu Programisty MaleMonki 0 5087 17.11.2019 12:47
Ostatni post: MaleMonki
  Spring framework – jakie strony polecacie do nauki? olek23 5 12600 15.11.2019 15:57
Ostatni post: Alsenas
  Programowanie windy (problem) w C++ mysza2323 2 12228 06.11.2019 23:04
Ostatni post: mysza2323
  Programy w C ~Anonim 1 12343 22.10.2019 17:48
Ostatni post: Szachista
  Wyświetlanie informacji z bazy danych na stronie www PitPlay 1 12755 16.09.2019 11:18
Ostatni post: Ajgor
  Błąd przy uruchamianiu programu w Java z wiersza poleceń Physicist 3 5443 30.08.2019 14:16
Ostatni post: Physicist
  Python z wiersza poleceń Physicist 15 33865 21.08.2019 20:14
Ostatni post: Physicist
  Transfer plików via FTP Visual Basic FireBytes 3 7957 15.08.2019 07:41
Ostatni post: Szachista
  Menu wysuwane z boku patryk67 1 12354 07.08.2019 12:43
Ostatni post: aht
  Visual Basic Excel l.całkowitą przedstawić w postaci szesnastkowej fugaz 4 14358 18.06.2019 21:36
Ostatni post: fugaz
  Nauka do Olimpiady Informatycznej? piotr0905 1 13746 08.06.2019 16:50
Ostatni post: wlisik
Ściana Prosta gra w Builder C++ Kiranek1 1 13967 31.05.2019 15:20
Ostatni post: Szachista