Skocz do zawartości

[ART]Pisanie DLLi C++


Rekomendowane odpowiedzi

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

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

To tak jak by powiedzieć ojcu że chcesz Garbusa gdy on oferuje Ci Lexusa :P

Odnośnik do komentarza
Udostępnij na innych stronach

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

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ę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

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

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

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

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

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

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

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 przez Mimek
Nie wyzywać się na forum! Mimek
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ę...