Skovvi Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 Witam.Ten art będzie będzie o pisaniu i wczytywaniu do GM'a DLLi w C++. Wiem że na tej stronie jest już taki art(sam się z niego uczyłem) ale troche osób miało problem ze zrozumieniem(np: CTRL). Postaram się go napisać jak najprościej WSTĘP: Ehh...to wyżej xD. Może nie opisze tego fachowo ale chyba nawet lepiej CO POTRZEBA: 1.Jakiś kompilator( ja używam Dev c++ i Code::Blocks[to są IDE ale mają w sobie kompilatory] i psyś kazał napisać że Visual C++ więc...polecam xD) 2.Game Maker7,8 PRO lub 6.1 C++: I.Tworzenie projektu 1.Uruchamiamy Dev c++(na nim będę pokazywał ) 2.Klikamy Plik->Nowy->Projekt 3.Pokazuje się okienko W dziale Basic jest "DLL". Zaznaczamy. 4.Poniżej ustawiamy nazwę projektu, np:"IniDLL"(bo taki dll cobie napiszemy ) II.Przygotowanie Klikamy 2 razy na "dllmain.cpp"(z lewej strony jest rubryka naszego projektu), następnie kasujemy cały jego kod . No i mamy pusto III.Piszemy! Najpierw wpisujemy używane biblioteki: #include <windows.h> My użyjemy tylko windows.h :] Następnie definicja funkcji(aby działało nam pod GM): #define funkcja extern "C" __declspec(dllexport) funkcja to nazwa do wywołania ;] każda funkcja będzie się więc zaczynała funkcja... No i teraz zabieramy się za funkcje dlla! Budowa funkcj: funkcja zwracana nazwa_funkcji ( argumenty ) { funkcja return zwracana } I to tylko tyle zwracana może być char* lub double(poprawione :P pomyłka :P) :]. Argumenty to dostarczane do dlla info :] np: char* Imie, int Wiek. Troche zagmatfane? chyba nie xD Jedziemy dalej 1 funkcja będzie nam zapisywać dane do ini: funkcja double ZapiszINI( char* Sekcja, char* Klucz, char* DoZapisu, char* Sciezka ) { WritePrivateProfileString(Sekcja,Klucz,DoZapisu,Sciezka); return 1; } i teraz małe tłumaczenie: funkcja nazywa sie ZapiszINI, zwraca liczbe 1, pobiera argumenty char* Sekcja, Klucz, DoZapisu(czyli text czy liczba...przy zapisie to nie ważne ) i Sciezka ... chwila...podłoże do pieca ... ok. Jestem xD ... 2 funkcja Wczytuje nam zmienną z ini funkcja char* WczytajZmiennaINI( char* Sekcja, char* Klucz, char* Sciezka, char* brak ) { static CHAR wartosc[256];//tu byl blad...czuje się podle!!! xD GetPrivateProfileString(Sekcja,Klucz,brak,wartosc,256,Sciezka); return wartosc; } Nie wiem czy ktoś zauważył że teraz zwraca char wartosc. Tą wartość ustala się w dllku bo ją pobieramy No i 3 funkcja: funkcja double WczytajLiczbeINI( char* Sekcja, char* Klucz, char* Sciezka, double brak ) { return GetPrivateProfileInt(Sekcja,Klucz,brak,Sciezka); } tym razem znowu zwraca liczbę ale: w 4 argumencie pobiera int, czyli liczbe ;] jest ona po to by przy braku ini wpisywać inną wartość :] Taka liczba awaryjna xD No...to dll napisany Jego treść: #include <windows.h> #define funkcja extern "C" __declspec(dllexport) funkcja double ZapiszINI( char* Sekcja, char* Klucz, char* DoZapisu, char* Sciezka ) { WritePrivateProfileString(Sekcja,Klucz,DoZapisu,Sciezka); return 1; } funkcja char* WczytajZmiennaINI( char* Sekcja, char* Klucz, char* Sciezka, char* brak ) { static CHAR wartosc[256]; GetPrivateProfileString(Sekcja,Klucz,brak,wartosc,256,Sciezka); return wartosc; } funkcja double WczytajLiczbeINI( char* Sekcja, char* Klucz, char* Sciezka, double brak ) { return GetPrivateProfileInt(Sekcja,Klucz,brak,Sciezka); } naciśnij F9 i się skompiluje ;D GML: Tworzymy sobie nowy skrypt, np: "MojZajeKur_abistyDLL_Init" i w nim kod: GML global.ZapiszINI=external_define("dll.dll","ZapiszINI",dll_stdcall,ty_real,4,ty_string,ty_string,ty_string,ty_string) global.WczytajZmiennaINI=external_define("dll.dll","WczytajZmiennaINI",dll_stdcall,ty_string,4,ty_string,ty_string,ty_string,ty_string) global.WczytajLiczbeINI=external_define("dll.dll","WczytajLiczbeINI",dll_stdcall,ty_real,4,ty_string,ty_string,ty_string,ty_real) objaśnienie: funkcja external_define wczytuje funkcje z dlla :] i teraz argumenty: GML external_define(nazwa dlla("dll.dll"),nazwa funkcji("moja super funkcja"),typ odwołania(zawsze wal dll_stdcall xD),zwracana(ty_real albo ty_string),ilość argumentów,typy argumentów(ty_real albo ty_string)) ;D i tyle ;p Mamu zdefiniowane :P Teraz zwalnianie. Nowy skrypt np:"MojZajeKur_abistyDLL_Free" GML external_free("SynthiaINI.dll") tu poprostu nazwa dlla ;D nie ma co opisywać xD no i używanie funkcji! xD I love this!!! Będziemy tworzyli dla każdej funkcji inny skrypt ;] skrypt do funkcji zapisu np:"INI_Zapisz": GML external_call( global.ZapiszINI, argument0, argument1, argument2, argument3 ) czyli: external_call(zmienna zdefiniowanej funkcji i argumenty do uzupelnienia ;D i jeszcze 2 funkcje :] czytaj zmienna: GML external_call( global.WczytajZmiennaINI, argument0, argument1, argument2, argument3 ) i czytaj real GML external_call( global.WczytajZmiennaINI, argument0, argument1, argument2, argument3 ) i tyle i teraz tworzymy objekt i w create skrypt MojZajeKur_abistyDLL_Init(), w game_end MojZajeKur_abistyDLL_Free() i i juz uzywa dlla i zwalnia przy wylaczeniu gry! WooW xD To teraz jeszcze używanie: ...chwila...napije się... ...już... ok... Więc: np po kliknięciu klawisza spacji zapisze nam się coś ;] GML sekcja=get_string("Sekcja","naszasekcja") klucz=get_string("klucz","klucz") klucz2=get_string("klucz2","klucz2") zmienna=get_string("zmienna","co kurna bolek?!") sciezka=get_string("Sciezka","C://plik.ini") wiek=17 skrypt_zapisz(sekcja,klucz,zmienna,sciezka) skrypt_zapisz(sekcja,klucz2,wiek,sciezka) zapisujemy sobie jakas zmienna i jakas liczbe ;D teraz np po kliknieciu entera sie wczytuje ;D GML sekcja=get_string("Sekcja","naszasekcja") klucz=get_string("klucz","klucz") klucz2=get_string("klucz2","klucz") sciezka=get_string("Sciezka","C://plik.ini") ini1=skrypt_wczytaj_zmienna(sekcja,klucz,sciezka,"Brak Klucza") ini2=skrypt_wczytaj_liczbe(sekcja,klucz2,sciezka,"Brak Klucza") i wszystko juz powinno działać :] I to "Sysko" w tym arcie EDIT: Przepraszam za kilka błedów. Czuje sie podle! naprawde...me serce krwawi! xD BY Skovv Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 1. nie polecaj średniowiecznych IDE takich jak DevCpp, zamień go szybciutko na Visual C++. 2. I to tylko tyle zwracana może być char*, double, int itp emot11.gif. Argumenty to dostarczane do dlla info emot11.gif np: char* Imie, int Wiek. Troche zagmatfane? chyba nie xD Jedziemy dalej Panie, coś nie tak, jakie int? Toż to funkcje eksportujesz dla GMa, który rozumie typy danych tylko: char* oraz double 3. funkcja char* WczytajZmiennaINI( char* Sekcja, char* Klucz, char* Sciezka, char* brak ) { CHAR wartosc[256]; GetPrivateProfileString(Sekcja,Klucz,brak,wartosc,256,Sciezka); return wartosc; } Wywali błąd, przynajmniej powinno, ba nawet musi. "CHAR wartosc[256];" musi być zadeklarowane jako zmienna statyczna czyli nie zostanie usunięta po wyściu z funkcji (co bez słowa static właśnie robi), a każde nowe odwołanie do funkcji będzie dawało dostęp do tej zmiennej statycznej którą już raz używaliśmy (dla tego statyczna aby dane zmiennej były pod tym samym adresem w pamięci) 4. 1.Jakiś kompilator( ja używam Visual C++ i Code:Block[to są IDE ale mają w sobie kompilatory]) Piszesz że używasz Visuala, a kod opisujesz w Devie, coś nie halo, popraw to. Ogółem nie pisze się o czymś o czym nie ma się pojęcia. Czuje sie podle! naprawde...me serce krwawi! xD Cry me a river Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 5 Lutego 2010 Autor Udostępnij Opublikowano 5 Lutego 2010 ok :D Zaraz zmienię xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
donway Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 Psysiu, ja np. wole DevCpp niż Visual C++ :] Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 5 Lutego 2010 Autor Udostępnij Opublikowano 5 Lutego 2010 Ale Dev C++ w sumie od kilku lat nie aktualizowane xD Troche xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 To tak jak by powiedzieć ojcu że chcesz Garbusa gdy on oferuje Ci Lexusa :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 5 Lutego 2010 Autor Udostępnij Opublikowano 5 Lutego 2010 Heh...kiedyś ściągnąłem vc++ ale nie mogłem się połapać :P Ale sobie ściągam :P I nauczę się obsługi xD Będę Hardcorem! xD 3. CYTAT funkcja char* WczytajZmiennaINI( char* Sekcja, char* Klucz, char* Sciezka, char* brak ) { CHAR wartosc[256]; GetPrivateProfileString(Sekcja,Klucz,brak,wartosc,256,Sciezka); return wartosc; } Wywali błąd, przynajmniej powinno, ba nawet musi. "CHAR wartosc[256];" musi być zadeklarowane jako zmienna statyczna czyli nie zostanie usunięta po wyściu z pamięci (co bez słowa static właśnie robi), a każde nowe odwołanie do funkcji będzie dawało dostęp do tej zmiennej statycznej którą już raz używaliśmy (dla tego statyczna aby dane zmiennej były pod tym samym adresem w pamięci (dostęp do nich był odblokowany)) Więc co radzisz? xD w dev c++ działa xD za to go lubię xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
donway Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 no ale DevCpp łatwiejsze w obsłudze, a skoro to poradnik dla początkujących on bardziej by się nadał :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 Hardkorem to jesteś używając Deva. Wiem że łatwy, sam bałem się przejść na Visuala (Ranma pamięta jak go wypytywałem co i jak o Visualu xD) a jak przysiadłem, wyjaśniono mi podstawy, to dalej sam szukałem info o obsłudze która okazała się banalnie prosta. Skovv, czytaj posta mojego pierwszego z punktami i poprawiaj :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
donway Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 No może, chyba też ściągnę tego visuala ;d Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 Więc co radzisz? xD w dev c++ działa xD za to go lubię xD W Devie wszystko "działa" bo nie debuguje dobrze przez co nie wiesz kiedy naruszasz zabronioną pamięć i doprowadzasz do wykrzaczenia programu. static CHAR wartosc[256]; i po bólu. Jak przenosiłem XenoNa z Deva na Visuala, to się przeraziłem ile błędów znalazł :0 i powiem jeszcze raz: Visual ma Boski debugger ;* Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 5 Lutego 2010 Autor Udostępnij Opublikowano 5 Lutego 2010 wszystko poprawione ;D(jak narazie) xD Mój "MiSZCZu" xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 Be Welcome ;) A skoro mam wolną chwilę to Wam zaraz napisze szybki arcik o obsłudze Visuala :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
donway Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 oo bardzo by się przydał :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 5 Lutego 2010 Autor Udostępnij Opublikowano 5 Lutego 2010 No xD I gites xD THX xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Slash (Pental) Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 Za tego arta powinieneś dostac Nobla. Nie wnosi nic nowego, poza idiotycznymi żarcikami, zbędnymi wcięciami i odstępami. Gdybym go przeczytał i nie miał pojęcia o DLLach pisanych na potrzeby projektów w GMie - zgłupiałbym. 1/5 na zachętę. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 5 Lutego 2010 Administratorzy Udostępnij Opublikowano 5 Lutego 2010 PsichiX nie jęcz, bo ja do zeszłego tygodnia pracowałem w Pajączku... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 https://gmclan.org/index.php?artykul=71 Mam nadzieję że już nie będziecie marudzić że Visual za trudny. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 5 Lutego 2010 Autor Udostępnij Opublikowano 5 Lutego 2010 Heh xD Potem się zajmę lekturą xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 Bez obrazy ale trzeba być na prawdę mało inteligentną istotą aby wymagać takich kursów. Jeśli ktoś taki istnieje to powinien sobie odpuścić programowanie bo to już jest przesada aby nie umieć obsługiwać najbardziej podstawowych opcji ide. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 5 Lutego 2010 Autor Udostępnij Opublikowano 5 Lutego 2010 Heh xD Bez przesady...ściągnąłem i usunąłem niedługo...nie bawiłem się zbytnio...idiotą raczej nie jestem xD(jednak nie jest to udowodnione naukowo :D) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pieter Opublikowano 5 Lutego 2010 Udostępnij Opublikowano 5 Lutego 2010 Psysiu, ja np. wole DevCpp niż Visual C++ :] a ja wolę Code::Blocks Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 5 Lutego 2010 Administratorzy Udostępnij Opublikowano 5 Lutego 2010 Właśnie, Code::Blocks jest przyjemny. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 6 Lutego 2010 Autor Udostępnij Opublikowano 6 Lutego 2010 boshe...jeszcze źle napisałem xD dwa :: mają być xD Poprawiam xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Slash (Pental) Opublikowano 6 Lutego 2010 Udostępnij Opublikowano 6 Lutego 2010 Za tego arta powinieneś dostac Nobla. Nie wnosi nic nowego, poza idiotycznymi żarcikami, zbędnymi wcięciami i odstępami. Gdybym go przeczytał i nie miał pojęcia o DLLach pisanych na potrzeby projektów w GMie - zgłupiałbym. 1/5 na zachętę. ... Więc z tego wynika...że jesteś idiotą. Takiego czegoś nie zrozumieć? Boshe... Taki oto PM dostałem od autora tego tematu. Co by tu dodać ;) ? Autor nie rozumie najwyraźniej, że jego artykuł to nieudana kopia tego, który znajduje się w GMClanowych zasobach i jest idiotyczny. Naprawdę nie widzisz, jakie to głupie? Najpierw wpisujemy używane biblioteki: O co kaman? Żeby tworzyć dlle w C++ trzeba znać się na C++, a nie rozbijać cały kod na linijki i komentować najprostsze instrukcje. To nie sprzyja edukacji, zważywszy na to, że nie potrafisz danego zagadnienia porządnie wytłumaczyć. funkcja to nazwa do wywołania ;] każda funkcja będzie się więc zaczynała funkcja... Każda funkcja będzie się więc zaczynała funkcja. Dobrze wiedzieć. I to tylko tyle zwracana może być char* lub double(poprawione tongue2.gif pomyłka tongue2.gif) emot11.gif. Argumenty to dostarczane do dlla info emot11.gif np: char* Imie, int Wiek. Sorry, ja nic z tego nie zrozumiałem. Gdyby ktoś miał wiedzę tak ogromną jak ty, wątpię, że by to coś zmieniło. Po prostu nie wiesz sam, jak to działa, twoja wiedza kończy się na znajomości pojęcia zmienna i funkcja. Troche zagmatfane? chyba nie xD Jedziemy dalej Twój błąd... ... chwila...podłoże do pieca ... ok. Jestem xD ... Tego chyba komentować nie trzeba. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 6 Lutego 2010 Autor Udostępnij Opublikowano 6 Lutego 2010 boshe...szkoda mi tego komentować... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
lenin Opublikowano 6 Lutego 2010 Udostępnij Opublikowano 6 Lutego 2010 skovv, slasz ma po prostu rację, więc po prostu nie potrafisz odpowiedzieć na jego argumenty :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skovvi Opublikowano 6 Lutego 2010 Autor Udostępnij Opublikowano 6 Lutego 2010 Taki oto PM dostałem od autora tego tematu. Co by tu dodać ;) ? Autor nie rozumie najwyraźniej, że jego artykuł to nieudana kopia tego, który znajduje się w GMClanowych zasobach i jest idiotyczny. Naprawdę nie widzisz, jakie to głupie? 1.O co kaman? Żeby tworzyć dlle w C++ trzeba znać się na C++, a nie rozbijać cały kod na linijki i komentować najprostsze instrukcje. To nie sprzyja edukacji, zważywszy na to, że nie potrafisz danego zagadnienia porządnie wytłumaczyć. 2.Każda funkcja będzie się więc zaczynała funkcja. Dobrze wiedzieć. 3.Sorry, ja nic z tego nie zrozumiałem. Gdyby ktoś miał wiedzę tak ogromną jak ty, wątpię, że by to coś zmieniło. Po prostu nie wiesz sam, jak to działa, twoja wiedza kończy się na znajomości pojęcia zmienna i funkcja. 4.Twój błąd... Tego chyba komentować nie trzeba. 1.Napisałem że trzeba najpierw wczytać biblioteki. Bo trzeba...Może ktoś nie wie i by nie wpisał? :D Pisze po kolei... 2.Nom tak...można sobie zmienić napis "funkcja" na inny 3.nie kończy się...pomyliłem się...tak już mam :P Zwraca zawsze char lub double. char to text a double to liczba 4.Naprawde musiałem podłożyć :P Wygasało xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Slash (Pental) Opublikowano 6 Lutego 2010 Udostępnij Opublikowano 6 Lutego 2010 1.Napisałem że trzeba najpierw wczytać biblioteki. Bo trzeba...Może ktoś nie wie i by nie wpisał? :D Pisze po kolei... Żeby pisać dlla w C++ trzeba znać chociaż podstawy. 2.Nom tak...można sobie zmienić napis "funkcja" na inny Każda funkcja będzie się więc zaczynała funkcja. To brzmi bez sensu. 3.nie kończy się...pomyliłem się...tak już mam :P Zwraca zawsze char lub double. char to text a double to liczba Po co mi to wiedzieć? Przydało by się tym, którzy chcą się czegoś dowiedzieć (edycja pierwszego posta mile widziana) 4.Naprawde musiałem podłożyć :P Wygasało xD Super. Ale kogo to obchodzi? boshe...szkoda mi tego komentować... Pff, co ja mam powiedzieć, kolego :) . Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
GMcliker Opublikowano 6 Lutego 2010 Udostępnij Opublikowano 6 Lutego 2010 (edytowane) Według mnie ten art jest zbędny ,ponieważ jak ktoś już mówił nie wnosi nic nowego. Tylko nieśmieszne żarciki i komentarze kodu 2/5 bo chciało ci się to pisać PS. Jesteś PoKeMoNeM , że cały czas piszesz "xD" i "o boshe"? Edytowane 6 Lutego 2010 przez Mimek Nie wyzywać się na forum! Mimek Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę