Newsgroup: it.comp.lang.c++
Titolo: Collegamento dinamico ad una DLL

Sto usando BC5 con OWL, ed ho seri problemi nel realizzare una
chiamata dinamica ad una DLL.
Il codice funziona, nel senso che la libreria viene effettivamente
chiamata, e la funzione eseguita, 
pero' dopo poco ottengo un crash del programma, dovuto proprio alla
chiamata, suppongo di sbagliare qualcosa, 
il codice e':
void miafunc (char* boh)
  {
  ... // notare che boh non viene mai usato nella func, ho rimosso
temporaneamente ogni riferimento ad esso
typedef NET_API_STATUS (*MYSHAREDEL95)(
                  const char FAR *,
                  const char FAR *,
                  unsigned short  );
HINSTANCE HLib;
MYSHAREDEL95 ProcShareDel95=0;
HLib= LoadLibrary ("SVRAPI.DLL");
    if (HLib)
      {
      ProcShareDel95= (MYSHAREDEL95) GetProcAddress(HLib,
"NetShareDel");
      if (ProcShareDel95)
        (ProcShareDel95) (0, "ATEST", 0);
      FreeLibrary(HLib);
      }
  ...
  }
main()
...
char *pippo = new char [100]
strcpy (pippo, "ciao pippo");
miafunc (pippo)
...
al ritorno pippo e' stato devastato, puo' essere NULL, oppure un
puntatore a qualsiasi cosa,
 e questo accade solo se chiamo la funzione dinamica, usando la
chiamata statica tutto va bene, 
non so che pensare.
Benche' la funzione venga eseguita con successo, il crash e' causato
proprio dalla linea
  (ProcShareDel95) (0, NETMAILSHAREDNAME, 0);
infatti rimuovendo questa linea tutto procede bene, come nel caso di
chiamata statica a:
NetShareDel (0, "ATEST", 0);
(cioe' con la funzione inclusa nel .DEF), che non causa nessun
problema
Se a qualcuno viene in mente qualcosa....
(per favore rispondetemi anche via EMail)
please remove NOSPAM from email address to write me.
/-------------------------------------------------------\
| DataDuck 5.1  Configurable DataBase and Plug-in Win95 | 
| also for Windows 3.1 and NT. Aim your Web browser at  | 
| 
http://www.prog.arch.unige.it/~aoddera/Homeao.htm
     | 
| to get your own copy!                                 | 
\-------------------------------------------------------/

Vado a occhio. Potrebbe essere un problema di dichiarazione del
puntatore a funzione.
Prova ad assegnare l'indirizzo della funzione stessa (linkata
staticamente) al tuo puntatore e vedere cosa succede. Ovvero prova a
fare questo:
	void miafunc (char* boh)
	{
	    typedef NET_API_STATUS (*MYSHAREDEL95)(
	                  const char FAR *,
	                  const char FAR *,
	                  unsigned short  );
	    // HINSTANCE HLib;
	    MYSHAREDEL95 ProcShareDel95=3D0;
	    // HLib=3D LoadLibrary ("SVRAPI.DLL");
	    // if (HLib)
	      {
	        // ProcShareDel95=3D (MYSHAREDEL95) GetProcAddress(
	        //                  HLib,
	        //                  "NetShareDel");
	        ProcShareDel95=3D NetShareDel;
	        // if (ProcShareDel95)
	            (ProcShareDel95) (0, "ATEST", 0);
	        // FreeLibrary(HLib);
	      }
	  ...
	  }
La riga che devi tenere sott'occhio =E8 l'assegnamento:
	ProcShareDel95=3D NetShareDel;
Che deve essere fatto senza cast e senza che il compilatore dia errore =
o
warning. Se il compilatore si lamenta, hai trovato il problema.
Altrimenti =85 non ho avuto fiuto.
---
     Andrea Ferro
SW.AN. Technologies s.a.s.
Merate (Lc)          Italy