Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Una DLL contentente la lingua
Forum - C/C++ - Una DLL contentente la lingua

Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 16:28
Domenica, 22/02/2009
Ciao! Stò continuando a creare un mio programma, solo che mi sono fermato perchè dovrei sviluppare il supporto a lingue extra... Mi spiego: ho il programma blabla.exe e la dll bla_lingua.dll! blabla.exe quindi carica tutte le stringhe dal file bla_lingua.dll e le stampa su console, e ogni volta che sostituisco la dll con un'altra dll contentente un'altra lingua, ovviamente la lingua del programma cambierà! Fin qui ci sono, ma quando vado a creare ad esempio un vettore di char contenente la stringa, una volta che compilo il tutto e metto la dll nella stessa cartella del programma, il valore restituito è null! Un esempio per essere più chiari:

EXE:
Codice sorgente - presumibilmente C/C++

  1. //Main.cpp
  2. #include <stdio.h>
  3. #include "language.h"
  4. int main(){
  5.   printf("%s",testo);
  6. }



DLL:
Codice sorgente - presumibilmente C/C++

  1. //Language.h
  2. const char *testo;


Codice sorgente - presumibilmente C/C++

  1. //Main_dll.h
  2. const char *testo="prova"


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:51
Lunedì, 23/02/2009
Amm.. sicuro di non star facendo confusione tra DLL e header (.h)?


Il mio blog: https://piero.dev
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 18:07
Mercoledì, 25/02/2009

omg, riformulare prego :)

un .h è un header, ovvero un file che contiene le dichiarazioni da includere nei file .cpp (o altri .h)

una dll è una libreria di collegamento dinamica

rispiegati, magari non abbiamo capito noi

PM Quote
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 21:21
Mercoledì, 25/02/2009
Eh mi sa che non mi sono espresso bene :S
Allora, io di solito quando creo una DLL, ci faccio il file CPP e una volta che compilo la DLL, ci faccio un header che includerò nel programma che userà questa dll (ovviamente linko anche la libreria con estenzione .a).
Ora il mio problema è che se creo delle variabili o delle costanti di tipo char e compilo sotto forma di DLL, se le vado a richiamare da qualche altro programma il valore restituito è NULL. Spero di essermi fatto capire bene XD se no sono costretto a postare degli esempi

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:24
Mercoledì, 25/02/2009
Non ti sei spiegato ...

PM Quote
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 0:08
Giovedì, 26/02/2009
Testo quotato

Postato originariamente da theprogrammer:

Non ti sei spiegato ...  


Allora, spiego passo passo ciò che faccio per creare una DLL e come la richiamo:

Per prima cosa uso il wxDevC++, poi creo la DLL ad esempio compilando il file main.cpp con al suo interno
Codice sorgente - presumibilmente C/C++

  1. int somma(int num1,int num2){
  2.     return num1+num2;
  3. }

.
Compilo la bella DLL e mi da come output due file: esempio.dll e libesempio.a! Ora apro un nuovo progetto e ci linko libesempio.a! Ora (cioè, io ho sempre fatto così :-| ) dovrei includere un header con scritto
Codice sorgente - presumibilmente C/C++

  1. // esempio.h
  2. int somma(int,int);


e semplicemente dal nuovo progetto che ho creato, ci faccio
Codice sorgente - presumibilmente C/C++

  1. #include <stdio.h>
  2. #include "esempio.h"
  3. int main(void){
  4.     printf("%i",somma(1,2));
  5. }


Ovviamente il programma partirà solo se nella stessa cartella del programma, ci sia esempio.dll!

Ora immaginiamo che la DLL debba contenere una stringa.. Questo per poter realizzare un programma multilingua! Ora creo due dll distinte:
Codice sorgente - presumibilmente C/C++

  1. // DLL 1: ITALIANO
  2. const char *menu[2]={"Prima Opzione","Seconda Opzione"};


Codice sorgente - presumibilmente C/C++

  1. // DLL 2: ENGLISH
  2. const char *menu[2]={"First Option","Second Opzion"};


compilo entrambi le dll in cartelle separate con entrambe il nome di language.dll.
Ora ho il programma vero e proprio, che andrà a prendere dalla DLL la lingua (la dll varierà a seconda della lingua). Ora includo l'header per richiamare il contenuto della DLL:
Codice sorgente - presumibilmente C/C++

  1. // language.h
  2. const char *menu[2];


e infine creo il main del .exe!

Codice sorgente - presumibilmente C/C++

  1. #include <stdio.h>
  2. #include "language.h"
  3. int main(void){
  4.     for(int i=0;i=sizeof(menu)/4;i++) printf("> %s <\n",menu[i]);
  5. }



Perchè nell'output restituisco dei null?
Credo che adesso sono stato sufficentemente chiaro :-|

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 7:36
Giovedì, 26/02/2009
Semplicemente perche' le variabili menu della DLL e del tuo programma non hanno nulla a che vedere l'una con l'altra.

Tu dichiari una variabile menu nel tuo programma che e' locale al tuo eseguibile.
Non e' "la stessa" di quella dichiarata nella tua DLL.

Per ottenere il valore dalla DLL, imposta una funzione che ottenga le stringhe in maniera opportuna cosi' come hai fatto per la tua funzione "somma".

Prepara una funzione che ad esempio chiami

getstring

fatta in modo da restituirti la stringa (o le stringhe) del vettore menu che vorrai.

Ultima modifica effettuata da theprogrammer il 26/02/2009 alle 7:40
PM Quote
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 14:06
Giovedì, 26/02/2009
Testo quotato

Postato originariamente da theprogrammer:

Semplicemente perche' le variabili menu della DLL e del tuo programma non hanno nulla a che vedere l'una con l'altra.

Tu dichiari una variabile menu nel tuo programma che e' locale al tuo eseguibile.
Non e' "la stessa" di quella dichiarata nella tua DLL.

Per ottenere il valore dalla DLL, imposta una funzione che ottenga le stringhe in maniera opportuna cosi' come hai fatto per la tua funzione "somma".

Prepara una funzione che ad esempio chiami

getstring

fatta in modo da restituirti la stringa (o le stringhe) del vettore menu che vorrai.


E quindi potrei fare così:
Codice sorgente - presumibilmente C++

  1. const char *menu[2]={"Prima Opzione","Seconda Opzione"};
  2. char *GetMenu(int i){
  3.     return menu[i];
  4. }

o sbaglio qualcosa? E se invece voglio che il valore che ritorna sia un vettore, quest'ultimo deve essere per forza dinamico e non statico?

PM Quote