Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

WinApi - Odświeżanie wypisywanej zmiennej.

piotreq17 20 Aug 2012 02:19 1893 19
  • #1
    piotreq17
    Level 10  
    Witam!

    Robię program w WinApi który odczytuję jakąś zmienną long int z pamięci funkcją
    Code: cpp
    Log in, to see the code

    następnie stworzyłem sobie pole statyczne
    Code: cpp
    Log in, to see the code

    i wyświetliłem tą zmienną
    Code: cpp
    Log in, to see the code

    i tu się zaczyna problem, ponieważ gdy skompiluje program i zmienna w pamięci się zmieni to w programie sie nie odświeża, to logiczne, że tak się dzieje ale nie mam pojęcia jak zrobić żeby ta zmienna się odświeżała i mój program pokazywał ją aktualną. Mam nadzieje, że dobrze opisałem problem, czekam na pomoc.
  • #3
    piotreq17
    Level 10  
    Wstawiłem w
    Code: cpp
    Log in, to see the code


    i puźniej w
    Code: cpp
    Log in, to see the code


    i nadal mam mały problem, timer działa prawidłowo sprawdzałem ale nie wiem gdzie wstawić
    Code: cpp
    Log in, to see the code

    jak wstawie w WM_TIMER to wywala błąd, że niezadeklarowane okno, a przeciez nie moge wrzucić deklaracji okna hMaxHapi gdzieś nad funkcje WndProc, może są jakieś inne pola tekstowe w WinApi którymi można takie coś zrobić?

    I takie inne pytanie
    Code: cpp
    Log in, to see the code

    najlepiej wrzucić w WM_DESTROY? A otwarcie w WM_CREATE bo teraz to wychodzi na to, że co sekunde otwiera uchwyt i zamyka, czy to nie przeszkadza?

    Edit: Poradziłem sobie w taki sposób, że wrzuciłem tworzenie okna do WM_TIMER
    Code: cpp
    Log in, to see the code

    tylko musiałem zmienić przedostatnią wartośc z hInstance na NULL, i nie wiem co to zmieniło i czy to jest prawidłowe, działać działa ale ja robie ten program głównie do nauki WinApi i bym był bardzo wdzięczny jakby mógł ktoś troszke opisać co to zmienia?
    No i pojawił się taki problem, że musze ustawić timer na małą wartość np. 100ms i jak to zrobie to zmienne w programie strasznie migają czy da się to jakoś poprawić?
  • #5
    piotreq17
    Level 10  
    A da rade może jakoś przykładem bo nie wiem jak uchwyt okna wrzucić do zmiennej?
  • Helpful post
    #6
    Dżyszla
    Level 42  
    No przecież to robisz.
    Code: cpp
    Log in, to see the code
    To nic innego jak zdefiniowanie zmiennej hMapi i przypisanie jej wartości wyniku funkcji. Możesz ją zadeklarować jako globalną (wtedy definicja i deklaracja muszą być oddzielone)
  • Helpful post
    #7
    gaskoin
    Level 38  
    Robi się to zazwyczaj przez operator przypisania =.

    Przykład:

    Code: cpp
    Log in, to see the code
  • #8
    piotreq17
    Level 10  
    Takie to proste, a ja siedziałem nad tym pół dnia... Dzięki wielkie panowie.


    EDIT:
    Niestety mam kolejny problem. mam adres w pamięci gdzie znajduje się string z 10 literowym słowem i chce go odczytać za pomocą ReadProcessMemmory, i jedyne co mi się udaje to odczytanie pierwszego znaku tego stringa... Nie mogę sobie z tym poradzić, możliwe ze to przez to, że ten string jest w UNICODE ale jak w takim razie takie coś odczytać?
  • #9
    Dżyszla
    Level 42  
    W wymienionej funkcji podajesz ile bajtów chcesz odczytać. Przyjrzyj się dokładnie parametrom i im opisom, jakie znajdziesz w pomocy WinAPI (są na stronach, a często także dołączane do kompilatorów) ;) Adres podajesz zawsze na pierwszy bajt, od którego czytasz, a z drugiej strony - także na pierwszy bajt swojej zmiennej, do której chcesz wczytać.

    UNICODE to po prostu 2 znaki na znak... Do odczytu w zasadzie interesuje Cię, że trzeba odczytać więcej. Potem interpretowanie np w celu wyświetlenia to już inna kwestia - używa się wtedy funkcji z przyrostkiem W.
  • #10
    piotreq17
    Level 10  
    Z tego co rozumiałem to powinno być coś takiego
    Code: cpp
    Log in, to see the code

    ale to niestety nie działa jak wyświetlam char_name np. coutem to wypisuje jakąś wartość hexadecymalną.
  • #11
    Dżyszla
    Level 42  
    Ale przeczytaj jeszcze raz opis funkcji ReadProcessMemory
    Quote:
    Parameters

    hProcess [in]

    A handle to the process with memory that is being read. The handle must have PROCESS_VM_READ access to the process.
    lpBaseAddress [in]

    A pointer to the base address in the specified process from which to read. Before any data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for read access, and if it is not accessible the function fails.
    lpBuffer [out]

    A pointer to a buffer that receives the contents from the address space of the specified process.
    nSize [in]

    The number of bytes to be read from the specified process.
    lpNumberOfBytesRead [out]

    A pointer to a variable that receives the number of bytes transferred into the specified buffer. If lpNumberOfBytesRead is NULL, the parameter is ignored.

    Przedostatni parametr określa liczbę bajtów do odczytania, a ostatni zwraca liczbę odczytanych bajtów. Czyli rozmiar masz podać w przedostatnim i musi wynosić sizeof(WCHAR) "razy" tyle znaków, ile chcesz odczytać.
  • #12
    beluosus
    Level 25  
    piotreq17 wrote:
    Niestety mam kolejny problem. mam adres w pamięci gdzie znajduje się string z 10 literowym słowem i chce go odczytać za pomocą ReadProcessMemmory, i jedyne co mi się udaje to odczytanie pierwszego znaku tego stringa... Nie mogę sobie z tym poradzić, możliwe ze to przez to, że ten string jest w UNICODE ale jak w takim razie takie coś odczytać?

    Dla wchar_t sprawa wygląda tak samo jak dla char:
    Code: cpp
    Log in, to see the code

    Jeśli nie jesteś pewien jak interesujące Cię dane są przechowywane to skorzystaj z programu Cheat Engine. Jest wyszukiwanie unicode, przeglądanie pamięci i wiele więcej... Upewnij się jak string jest zakończony (null-terminator?), czy jego długość może przekraczać 20 znaków etc.

    Dżyszla wrote:
    UNICODE to po prostu 2 znaki na znak...

    Nieprawda. Wszystko zależy od metody kodowania, chociaż często się to właśnie sprowadza do 2ch bajtów na znak (ale należy pamiętać, że nie jest to regułą).
  • #14
    Dżyszla
    Level 42  
    No prawda, z tym kodowaniem sprawa jest zwiła. Ja akurat mówiąc o UNICODE mam na myśli To, co jest kodowane w systemach ja ko WideChar/WidePChar czyli 16 bitów / znak. Prawdą jest też, że dopiero standardy UTF/USC definiują sposób kodowania i tam może to być równie dobrze 32-bity na znak, jak i wartość zmienna w szerokim zakresie.
  • #15
    piotreq17
    Level 10  
    Gaskoin te podpunkty były zbędne bo przed napisaniem każdego posta przeszukuje internet i na stronkę msdn wchodzę na sam początek problem bardziej w tym, że to wszystko jest opisane dość zaawansowanym językiem a ja się jeszcze tak nie znam:P. A co do problemu to próbując waszym sposobem zamiast tego stringa dostaje liczbe heksadecymalną:/
    i nadal nie wiem co z tym zrobić. Do znalezienia tego stringa używałem własnie Cheat Engine i wiem, że potrzebuje odczytać tylko 10 znaków. Sprawdziłem adres i pasuje naprawde ciężka sprawa z tym...
  • Helpful post
    #17
    gaskoin
    Level 38  
    I pokaż jak to wywołujesz :)

    Liczba którą dostajesz być może jest adresem w pamięci do którego wystarczy się odwołać.
  • #18
    piotreq17
    Level 10  
    Wywołałem tak:
    Code: cpp
    Log in, to see the code

    cout zwraca 0x474160, w stringu znajduje się słowo Cubeex.
  • Helpful post
    #19
    beluosus
    Level 25  
    piotreq17 wrote:
    Code: cpp
    Log in, to see the code

    Definiujesz tablicę 20 stringów (cout wyświetla początkowy adres tej tablicy)... to jest kompletnie źle. Nie wiesz jakie pola może przechowywać klasa string ani w jakiej kolejności - nie możesz całego obiektu (a raczej tablicy) tak po prostu nadpisać. Zrób tak jak wyżej i będzie ok (zamień na tablicę znaków). Jeśli chcesz skorzystać z dobrodziejstw STL to zainicjalizuj stringa dopiero po odczycie:
    Code: cpp
    Log in, to see the code
  • #20
    piotreq17
    Level 10  
    Poradziłem sobie zamykam temat.