Pagina 2 di 2

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 27/01/2010, 16:13
da Sla
se una dll è fatta per gm sicuramente trovi un help o una descrizione da qualche parte che ti dice come usarla.

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 07/02/2010, 16:02
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?

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 28/03/2010, 13:12
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?

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 28/03/2010, 13:40
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).

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 30/03/2010, 15:20
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.

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 30/03/2010, 16:14
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:

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 24/07/2010, 13:11
da guidox
Grazie Maz è da un po che smanetto con il c++ ed ho trovato il tuo tutorial molto interessante. :D

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 09/06/2011, 15:00
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;
}

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 23/06/2013, 23:12
da Sla
Nuova icona per gli stick! Ben fatto.

Re: DLL Topic Ufficiale Creazione & Commenti

Inviato: 24/06/2013, 12:26
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: