Newsgroup: it.comp.lang.c++
Titolo: DLL & C++Builder4

Salve,
ho il C++ Builder 4 con SP 2 e ho strani problemi con una DLL da me creata.
La dll in questione contenente una 20a di classi (di cui alcune template)
che ho linkato con un programmino client (attraverso il .lib).
In compilazione tutto OK, ma in esecuzione NON FUNZIONA !!! Il bello è che
se linko tutti i singoli file contenenti le classi DIRETTAMENTE col sorgente
client FUNZIONA ! Come mai ???
Qualcuno sa darmi una spiegazione ??? Sono rimasto bloccato su questo
problema da una settimana !!!
Sarà il Builder bacato ???
Grazie, Ciao Lvca.





Probabilmente, vista la specificita' della tua domanda, dovresti postare
su it.comp.programmare.win32. Anzitutto devi esportare i simboli della
tua DLL, ovvero davanti alla dichiarazione di ogni classe, variabile
globale, funzione libera devi aggiungere __declspec(dllexport); siccome
i simboli devono a loro volta essere importati nell'eseguibile, li
andrebbero dichiarati __declspec(dllimport). Di solito si risolve con le
macro:
// Dll.h
#ifdef DLL_EXPORT
#define DICHIARA __declspec(dllexport)
#else
#define DICHIARA __declspec(dllimport)
#endif
class DICHIARA Pippo {
  int f();
};
// Dll.cpp
#define DLL_EXPORT
#include DLL_IMPORT
int Pippo::f() { return 2; }
Attenzione che questo serve solo per tutte le funzioni che NON sono
dichiarate inline; da questo deriva che una classe in una DLL non puo'
avere sia metodi inline che out of line. In particolare i template, se
non sono istanziati esplicitamente non vanno dichiarati.
Spero funzioni!
Ciao,
Nicola

Come dicevo nel msg in compilazione non ci sono problemi.
Il problema è che quando uso la dll il comportamento è diverso rispetto a
quando linko il mio programmino direttamente con tutti i sorgenti SENZA
PASSARE PER LA DLL.
Quindi il problema è o in compilazione (non mi compila "bene" alcuni
sorgenti) o a run-time !!!
Debuggando la DLL ho visto dei comportamenti strani, uno per tutti: in un
costruttore un membro di una classe viene assegnato ad un valore preso in
ingresso come parametro, solo che il valore dopo l'assegnazione è diverso
!!!
Ricompilando il sincolo .cpp ha funzionato, ma c'erano altri problemi simili
in altri CPP.
Quindi PERCHE' IL BUILDER NON MI COMPILA BENE I MIEI SORGENTI ???
Ciao, Lvca.
Nicola Musatti <Nicola....@ObjectWay.it> wrote in message
news:384CC40A...@ObjectWay.it...


 
Dovresti dare qualche dettaglio in piu', anche se non ho tempo di
provare eventuale codice.
Ciao,
Nicola

Ho seguito le tue indicazioni, ma rimane lo stesso problema.
Sono riuscito però a identificarlo meglio:
Se linko un mio prg client alla dll mi da un errore sulla chiamata di un
metodo contenuto nella dll.
Allora ho deciso di debuggare la dll. Come ? Aprendo il progetto .dll e
inserendo come PARAMETRO HOST di esecuzione il file .exe che sarebbe il prg
client. Beh in questo modo TUTTO FILA LISCIO !!!!
Chi sa darmi una spiegazione ??


Scusa l'ipotesi un po' semplicistica, ma sei sicuro che DLL ed EXE si
vedano, ovvero che siano nella stessa directory oppure entrambi in
directory specificate dalla variabile PATH?
Ciao,
Nicola

Sì, il problema si è magicamente risolto dopo che nel progetto della dll ho
inserito il path in "Final Output". Sembra strano ma così funziona! Se
invece (come facevo prima) li copiavo a mano in dir apposita non fungeva !!!
Boh...
Cmq i problemi non sono finiti!
2 su 3 client funzionano benissimo. Uno che praticamente deve eseguire delle
interrogazioni si ferma in un punto fa il display di un oggetto.
Ecco il codice:
      cout << "-----------------------------" << endl;
      cout << "Nome......: " << cliente->nome << endl;
      cout << "Cognome...: " << cliente->nome << endl;
      cout << "Eta.......: " << cliente->eta << endl;
Mi si blocca su quest'ultima riga. + Precisamente sulla deallocate chiamata
evidentemente dalla STL:
memory.h
---------------
void deallocate(pointer p, size_type)
{
  ::operator delete(p);   <<<<<<<<<<<<< QUI !!!!
}
eta è un attributo di tipo unsigned short. Ho notato che se converto eta in
una stringa (con sprintf) tutto funziona!
Boh.
Nicola Musatti <Nicola....@ObjectWay.it> wrote in message
news:384D320B...@ObjectWay.it...


Mmmh, ti consiglio di seguire i newsgroup della Borland su
forums.borland.com
 . Ad esempio su borland.public.cppbuilder.language e'
in corso una discussione (cui partecipo) che potrebbe avere a che fare
con il tuo problema. Il subject E' "Problem with STL vectors and strings
and static libraries".
Ciao,
Nicola

Il newsgroup borland.public.cppbuilder.language non lo vedo sul mio server
delle news: Che news server usi ???
Grazie, Ciao Lvca.
Nicola Musatti <Nicola....@ObjectWay.it> wrote in message
news:384D3D61...@ObjectWay.it...


Devi collegarti a 
forums.borland.com
 . Anche se tu vedessi i newsgroup
dal tuo server, ti converrebbe comunque collegarti direttamente al
server Borland, perche' fanno un minimo di moderazione.
Ciao,
Nicola