Skocz do zawartości

Kłopot z DLL'ami...


Exigo

Rekomendowane odpowiedzi

Pierwszy raz mam do czynienia z Dll'ami... i już jest kłopot.

Użyłem sobie dll'a "Xtend" (autorstwa Snake) w taki sposób...

Create.

GML
init_xtend();

ADRES_szybkosc_ataku = $57546C1C;

szybkosc_ataku = 0;

PROCES = process_id_from_window_handle(metin2);

Alarm.

GML
alarm[0] = 10;

szybkosc_ataku = process_read_long(PROCES,ADRES_szybkosc_ataku);

Draw.

GML
draw_text(x,y,"Szybkosc Ataku:"+string(szybkosc_ataku));

Problem polega w tym, że program nie wie... co oznacza ten kod:

PROCES = process_id_from_window_handle(metin2);

W czym problem? :(

Odnośnik do komentarza
Udostępnij na innych stronach

Nie zdefiniowałeś zmiennej "metin2" / nie zapisałeś w niej uchwytu okna z tej gry ?

 

GML
// wyszukaj okno gry po nazwie ( nie wiem czy nazwane jest "Metin 2" )

metin2 = window_find( '', 'Metin 2' );

// pobierz identyfikator procesu z uchwytu okna

PROCES = process_id_from_window_handle( metin2 );

albo możesz tak znaleźć PID:

GML
// odszukaj PID po nazwie procesu ( nie wiem czy nazywa się "metin2.exe" )

PROCES = process_id_from_name( 'metin2.exe' );
Odnośnik do komentarza
Udostępnij na innych stronach

Eh... nie działa. Znaczy, wszystko chodzi jak powinno, lecz wyświetla złe dane (powinno być 100, lecz jest 0)

Sprawdzałem jeszcze raz HEX'a, to jest prawidłowy. Proces też jest dobrze napisany... :o

(Na wszelki wypadek, pokażę jeszcze kod.)

 

Create Event:

execute code:

 

init_xtend();

 

PROCES = process_id_from_name( 'metin2.bin' );

 

ADRES_szybkosc_ataku = $57596F5C;

szybkosc_ataku = 0;

 

 

 

 

Alarm Event for alarm 0:

execute code:

 

alarm[0] = 10;

szybkosc_ataku = process_read_long(PROCES,ADRES_szybkosc_ataku);

 

Draw Event:

execute code:

 

draw_text(x,y,"Szybkosc Ataku:"+string(szybkosc_ataku));

 

Co jest nie tak?.. :(

Odnośnik do komentarza
Udostępnij na innych stronach

"Sprawdzałem hexa"... sprawdzałeś adres i w edytorze pamięci miałeś prawidłową wartość ? Może Xtend nie ma dostępu do tego regionu pamięci / do procesu bo process_read_* zwraca 0 gdy nie udaje się odczytać wartości z pamięci...

Odnośnik do komentarza
Udostępnij na innych stronach

Wiem na czym to polega. Czyli w edytorze pamięci miałeś prawidłową wartość tego speeda... pewnie Xtend nie może otworzyć procesu Metina, bo nie ma dostępu. Zaraz zrobię update dll-a i zobaczymy czy uda Ci się to odczytać.

 

EDIT: Już zrobiłem: https://forum.gmclan.org/index.php?showtopic=11240

 

Dodaj linijkę:

GML
xtend_set_debug_privilege();

po init_xtend();

Odnośnik do komentarza
Udostępnij na innych stronach

U mnie wyświetliło szybkość ataku i nazwę gracza. (oczywiście po restarcie gry adresy się pozmieniały przez dynamiczną alokację pamięci).

 

Albo podajesz złe adresy albo nie można przechwycić PID po nazwie procesu.

Sprawdź czy pobrano ID procesu

GML
if ( PROCES == 0 ) show_message( 'Metin 2 nie jest uruchomiony.' );

Jeśli będzie ok, to nie wiem co robisz źle, bo u mnie działa. A mam tak:

GML
init_xtend();

attack_speed_pointer = $4A64C614; // tymczasowy adres zmiennej przechowującej szybkość ataku

process = process_id_from_name( 'metin2.bin' );

if ( process == 0 ) show_message( 'Nie znaleziono procesu' );

attack_speed = process_read_long( process, attack_speed_pointer );

 

PS: Nie, nie gram w Metina - mój brat sprawdzał co to jest i zostało na dysku.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...