Newsgroup: it.comp.programmare.win32
Titolo: richiamare DLL

Salve a tutti, muovo i primi passi di programmazione giusto adesso e dovendo
modificare un programma già esistente ho fatto quanto segue:
Ho creato un applicazione a sè stante che legge dei file in ingresso e fa
certe operazioni.
Dopo di che vedendo che tutto andava bene, ho creato ex-novo una DLL
inserendo i file sorgenti nel progetto dll nuovo e compilando il tutto in
"ExtraU.dll". Copio poi questo file nella directory dell'eseguibile
principale insieme alle altre dll utilizzate. tutto bene (credo)
Ora, nel programma che devo modificare al click su un bottone dovrebbe
aprirsi la mia nuova dll al posto della vecchia, ma così non succede.
Nella dll che richiama la mia ho inserito il seguente codice:
HINSTANCE gLibEx = AfxLoadLibrary ("ExtraU.dll");
// Nel caso non sia possibile caricare la dll.
if (!gLibEx)
MessageBox (NULL, "Attenzione !\nImpossibile caricare 'ExtraU.dll'
!\nAssicurarsi che il file sia presente nella directory corrente !\n",
"Inserimento di una scena", MB_ICONERROR);
else{
// Estraggo l'indirizzo della funzione Extraurbana() della libreria
Extraurbana = (EXTRA) GetProcAddress (gLibEx, "InsMappaExtra");
Extraurbana ();
}
ed in effetti l'errore che mi esce è proprio la messagebox che mi avvisa di
nn essere riuscito a caricare la dll. Come mai non la vede? dove sbaglio?
grazie delle risposte
Mattia

ILLgiano ha scritto:

prova ad inserire il path completo della dll e comunque usa getlasterror 
  e formatmessage per avere + info sull'errore
ciao

 ha scritto nel messaggio
news:425e0afa$1...@news.unimib.it...

Fatto: ho inserito il path completo e non cambia nulla.
dall'uso di getlasterror e formatmessage scopro che il sistema mi risponde
con l'errore "1114:Routine di inizializzazione della libreria di
collegamento dinamico (DLL) non riuscita"
Che ci sia qualche errore nella dll? devo scrivere qualche riga di codice
particolare x farla "digerire" al programma originale?
Ho scritto solo:
extern "C" BOOL PASCAL EXPORT InsMappaExtra()
{
AFX_MANAGE_STATE (AfxGetStaticModuleState());
// Allocazione e visualizzazione della finestra di richiesta dei dati sulla
scena extraurbana
CInsMappaExtraDlg Scena;
Scena.DoModal();
return 1;
il DoModal non basta?

 [...]
fa un po' vedere la DllMain
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 collegamento dinamico (DLL) non riuscita"
il problema, come ti ha indicato mnrt, è nella dllmain che o ritorna 
false o causa qualche eccezzione


ma hai scritto la routine di ingresso nella dll?
ti posto qui una base che puoi usare (usa due tipi di routine di ingresso 
per compatibilità).
Se non devi fare qualcosa di particolare all'avvio puoi lasciarle così come 
sono
//------------------------------------------------------------------
BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason )
    {
        case DLL_PROCESS_ATTACH:
         // Initialize once for each new process.
         // Return FALSE to fail DLL load.
          break;
        case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;
        case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;
        case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
          break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}
//------------------------------------------------------------------
BOOL WINAPI DllEntryPoint(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
  return DllMain(hinstDLL, fdwReason, lpReserved);
}
//------------------------------------------------------------------


 Sono riuscito finalmente ad entrare nel ciclo di chiamata della DLL, ora
però mi dà errore di applicazione:
"l'istruzione a 0x0000 ha fatto riferimento alla memoria 0x0000, la memoria
non poteva essere "read"".
che significa?
Dopo aver caricato la dll (con LoadLibrary) cerco l'istruzione InsMappaExtra
presente nella dll con
GetProcAddress(gLibEx, "InsMappaExtra");
e poi richiamo la funzione che esporto dalla dll
InsMappaExtra();
Nella DLL basta questo per richiamare la finestra di dialogo definita nella
classe CInsMappaExtraDlg?
extern "C" BOOL PASCAL EXPORT InsMappaExtra()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CInsMappaExtraDlg finestra;
finestra.DoModal();
return TRUE;
}
grazie anche per le risposte precedenti
MattiA


Ce l'ho fatta da me, ho manipolato un pò il codice...mancava una variabile
di ritorno.
grazie comunque dell'attenzione e delle risposte datemi.
Mattia