DLL Topic Ufficiale Creazione & Commenti

Gex, Dll, DyLib, Js e ogni tipo di estensione per GameMaker
Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da Sla »

se una dll è fatta per gm sicuramente trovi un help o una descrizione da qualche parte che ti dice come usarla.
eppure mi sembra tutto giusto...

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da Jak »

Tre parole... SEI GRANDE MAZ! Un dubbio però, posso creare ds in c++(studio c da poco, so qualche base)? E come si fa a usare altre dll da questa dll(es:U3D)? La mia idea è quella di ampliare come possibilità le particelle in U3D (anche mesh e non solo billboard per esempio). Ci sono riuscito con gm ma è estremamente lento (troppe informazioni ed elaborazioni) quindi volevo farlo in c/c++. Mi date una mano?
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da BaronVsCorsar »

una domanda piuttosto banale... se una dll è pensata per il C++, e ha alcune funzioni che richiedono un puntatore a variabile come parametro (verosimilmente modificherà direttamente il valore della variabile) questa
dll non posso usarla in GM, giusto?
suppongo che dovrei ricreare la dll aggirando in qualche modo il problema creando "funzioni interfaccia" adeguate a gml...

è giusto, o c'è qualche trucco più semplice?
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da maz85 »

Non ho mai provato (semmai dopo faccio una prova), ma suppongo non ci siano problemi se queste funzioni sono private cioè lavorano tra di loro, mentre le pubbliche si interfacciano con GM perchè non saprei come passare un puntatore da GM alla dll se non giocando con qualche casting...(quindi non penso prenda la variabile come puntatore).
Per il discorso di interfaccia:

Codice: Seleziona tutto

int prendopuntatoreeloelaboro(int *ptr)
{
 //funziona interna
 //eseguo operazioni
}

Codice: Seleziona tutto

export double funzionerichiamatasugm(double var)
{
//funzione pubblica
 int *ciao;
 ciao=&var;
 prendopuntatoreeloelaboro(ciao);

}
Dll come ultimate3d penso facciano largo uso di puntatori ecc... passando solo double.
Spero di non aver scritto cazzate, si necessita di provare sul compilatore. (aka se ho cantonato correggetemi)

@Jak: in una dll puoi richiamare un'altra dll, ma a questo punto fai prima su Gm ad utilizzare 2 dll (ultimate3d+la tua).

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da Jak »

maz85 ha scritto:@Jak: in una dll puoi richiamare un'altra dll, ma a questo punto fai prima su Gm ad utilizzare 2 dll (ultimate3d+la tua).
Ci avevo già rinunciato da un pezzo per via del fatto che con tutto il lavoro che dovrei fare diventa complicatissimo e più lento di gm. Comunque guarda la data del mio post.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da BaronVsCorsar »

maz85 ha scritto:
Spoiler
Non ho mai provato (semmai dopo faccio una prova), ma suppongo non ci siano problemi se queste funzioni sono private cioè lavorano tra di loro, mentre le pubbliche si interfacciano con GM perchè non saprei come passare un puntatore da GM alla dll se non giocando con qualche casting...(quindi non penso prenda la variabile come puntatore).
Per il discorso di interfaccia:

Codice: Seleziona tutto

int prendopuntatoreeloelaboro(int *ptr)
{
 //funziona interna
 //eseguo operazioni
}

Codice: Seleziona tutto

export double funzionerichiamatasugm(double var)
{
//funzione pubblica
 int *ciao;
 ciao=&var;
 prendopuntatoreeloelaboro(ciao);

}
Non mi pare che così funzioni...
Facendo in quel modo io passo l'indirizzo della variabile locale della funzione funzionerichiamatasugm, non del parametro che passo a gm.
Essendo "var" definita come double questa ha un indirizzo nello stack delle chiamate a funzioni, gli si assegna il valore passato alla chiamata della funzione (quindi da GM), ma quando uso l'operatore indirizzo &var passo l'indirizzo della variabile sullo STACK, non di gm!
Ovvio che poi funziona tutto (cioè non ricevo errori), ma la variabile di GM non viene modificata.

...
a meno di fare (in GM)
variabile = funzionerichiamatasugm(variabile)

e in C++ modificare la funzione in

export double funzionerichiamatasugm(double var)
{
//funzione pubblica
int *ciao; //int o quello che serve ovviamente!)
ciao=&var;
prendopuntatoreeloelaboro(ciao);
return (*ciao);
}

Uhm... sì insomma, è possibile, ma servono i sorgenti della DLL, un discreto numero di funzioni di interfaccia e una bella ripassata del dettaglio di tutte le funzioni della dll per essere sicuro di non sbagliare.

Magari è più semplice fare un DLL che chiama le funzioni dell'altra DLL (fatta per il C++)per poter copiare facilmente le nuove versioni della DLL C++...

uhm... più lavoro di quanto speravo :( E non ho neppure mai compilato una dll in vita mia... bene! altro da imparare :lol:
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da guidox »

Grazie Maz è da un po che smanetto con il c++ ed ho trovato il tuo tutorial molto interessante. :D
Immagine

Immagine

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da Jak »

Mi sono messo da un po a studiare il c++ tramite un(bellissimo) libro consigliatomi da sla.
Non sono ancora ad un livello decente per fare qualcosa ma volevo mettere in pratica ciò che facevo facendo qualche dll per imparare(il mio obiettivo che penso, ora come ora, di poter raggiungere tranquillamente è quello di fare una dll per il metodo della diffusione di homu che a mio parere è forse un po più lento e richiede più risorse ma ha molte più potenzialità per una eventuale IA)
Ho fatto una semplice dll che sfrutta la memoria dinamica, a me funziona perfettamente ma giusto per curiosità l'ho fatta provare a nocche al quale però non andava(diceva mancava una dll di windows), ho quindi provato ad usare vs 2008 e anche con quello, seppur con un'errore diverso, a me andava ed a lui no.
Volevo quidni sapere se era un caso mio che va o un caso suo che non va oppure se cè qualche errore strano che non permette il funzionamento ad una certa gamma di pc.
Quindi ecco il file compresso dove troverete dll e gm81(forse dovevo farli in gmk ma chissà dove ho messo gm8.0) sia per vs2010 che per vs2008. Basterà far partire il gioco in teoria dovrebbe disegnare a schermo "37" sempre che non cambiate il valore nel create.
Se vedete che non va provate a fare qualche aggiornamento e a scaricare i redistributable:
http://www.microsoft.com/downloads/en/d ... laylang=en
http://www.microsoft.com/downloads/it-i ... 50143D5867
Sono per vs2010 per i x86 e 64 bit, credo che coprano pure quelli per vs2008 ma non ne sono sicuro.
Ditemi eventuali problemi e cose cosi.
Per fare la dll ho creato un nuovo progetto applicazione consolle e selezionato che fosse un progetto dll vuoto.
Il codice usato è motlo semplicemente questo:

Codice: Seleziona tutto

#define export extern "C" __declspec( dllexport )

export double crea_variabile(double valore)
{
        double* a = new double(valore);
		int b= (int) a;
		return (double) b;
}

export double leggi_variabile(double puntatore)
{
        int a = (int) puntatore;
		int* b = (int*) a;
		double* punt = (double*) b;
		return (double) *punt;
}

export double cancella_variabile(double puntatore)
{
        int a = (int) puntatore;
		int* b = (int*) a;
		double* punt = (double*) b;
		delete punt;
		return 0;
}
Come vedete non fa altro che creare, leggere e cancellare una variabile di tipo double, più di metà del codice alla fine son solo conversioni di tipo per far si che GM legga l'indirizzo alla variabile come un double, so che se un'utente mageggia a caso i valori potrebbe fare degli errori ma come ho detto è solo una prova.
Altra cosa che mi interesserebbe sapere è la compatibilità con i 64 bit, qualcuno sa cosa devo fare/evitare di fare perchè un programma sia compatibile anche con gli winzoz a 64 bit?

EDIT:altra cosa che non ho detto. Non ho idea di cosa cambi perchè son ancora inesperto ma ho lasciato il set di caratteri unicode. Potrebbe influenzare qualcosa? Ora sto facendo a provare a nocche con il multibyte...

EDIT2: ecco l'archivio con le nuove dll con set caratteri multibyte anche se non credo cambi nulla...
http://www.mediafire.com/?xq2twkfa1bsudab

EDIT3: ecco ho pure ridotto le conversioni di tipo in un'unica riga cosi da evitare l'uso di variabili temporanee(quindi più veloce) ed essere più leggibile:
Spoiler

Codice: Seleziona tutto

#define export extern "C" __declspec( dllexport )

export double crea_variabile(double valore)
{
		return (double) (int) new double(valore);
}

export double leggi_variabile(double puntatore)
{
		double* punt = (double*) (int*) (int) puntatore;
		return (double) *punt;
}

export double cancella_variabile(double puntatore)
{
		delete (double*) (int*) (int) puntatore;
		return 0;
}
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da Sla »

Nuova icona per gli stick! Ben fatto.
eppure mi sembra tutto giusto...

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: DLL Topic Ufficiale Creazione & Commenti

Messaggio da Tizzio »

Sla ha scritto:Nuova icona per gli stick! Ben fatto.
Modestamente
Era necessario cambiare quella macchia sembrava "qualcosa di colore bianco" con un punto esclamativo in mezzo :asd:

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti