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