Newsgroup: it.comp.programmare.win32
Titolo: MALEDETTE LIBRERIE!!!

Ciao, ho un bel problemino con la creazione e uso di una DLL
in modo dinamico:
In un progetto DLL in C++Builder:
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
	return 1;
}
// la mia funzione da esportare:
extern "C" void __declspec(dllexport) PluginEntryPoint(void)
{
	//return (NULL);
}
Nell'altro progetto C++Builder:
handlePlugin = ::LoadLibrary("SMSDisplayer.dll");
if (handlePlugin != NULL) {
     EntryPointFunct = GetProcAddress(handlePlugin, "PluginEntryPoint");
     MessageBox(NULL, "GetProcAddress", "Info", MB_ICONHAND);
     FreeLibrary(handlePlugin);
     MessageBox(NULL, "Chiusura", "Info", MB_ICONHAND);
}
Il codice su, funziona bene, nel senso che se ritardo la FreeLibrary(),
la funzione nella dll viene chiamata con successo e in modo desiderato!
Ma come vedete dal codice, quando lo eseguo ottengo:
Messaggino con la scritta "GetProcAddress"
e subito un errore di protezione verso la memoria che non poteva essere 
read, bla bla...
Perchè??? il progetto della DLL è stupido e su descritto!!!

 Perchč??? il progetto della DLL č stupido e su descritto!!!
Non si capisce dove richiami la funzione.
Se la richiami dopo la FreeLibrary, la DLL non č piů mappata nello 
spazio di indirizzamento del tuo processo (se non era stata caricata 
piů volte) e quindi la chiamata a funzione salta ad un indirizzo non 
valido o, se nel frattempo quello spazio era stato usato per 
caricarci un'altra DLL, in un pezzo di codice che non c'entra nulla 
con quello della funzione originale.
-- 
Valter Minute
(the reply address of this message is invalid)
(l'indirizzo di reply di questo messaggio non č valido)

Perchč??? il progetto della DLL č stupido e su descritto!!!
In VC++6 funziona senza errori. Ti riporto il codice che ho usato
nel test.
int APIENTRY WinMain (HINSTANCE hInst,HINSTANCE hPrevInst,
            LPSTR lpCmdLine,int nCmdShow)
{
HMODULE handlePlugin = ::LoadLibrary ("SMSDisplayer.dll");
void (*EntryPointFunct)(void);
if (handlePlugin != NULL)
   {
   EntryPointFunct = (void (*)(void)) GetProcAddress
                               (handlePlugin,"PluginEntryPoint");
   if (EntryPointFunct == NULL)
      return 1;
   MessageBox (NULL,"GetProcAddress","Info",MB_ICONHAND);
   FreeLibrary (handlePlugin);
   MessageBox (NULL,"Chiusura","Info",MB_ICONHAND);
   }
else
   MessageBox (NULL,"Errore di LoadLibrary","Info",MB_ICONHAND);
return 0;
}

 nel test.
Si lo so il codice funziona benissimo, anche creando un progetto CBuilder.
Il problema mi sa è che io lo sto utilizzando in un Servizio Borland
(classe TService); mi sa che è proprio questo il problema, perchè anche
altre stupidate non mi funzionano (tipo istanziare una classe che crea 
un file in C:, ed altre stupidate...).
E' come se avesse dei privilegi quasi zero nell'eseguire alcune parti di
codice!
Come devo fare secondo voi?!

Come devo fare secondo voi?!
Mai lavorato col Borland, mai fatto servizietti!
Pero' gli errori piu' comuni riguardano l'uso dell'istanza del
chiamante e della DLL: LoadLibrary ritorna l'istanza della DLL,
non usare risorse di essa con l'stanza del chiamante.

 non usare risorse di essa con l'stanza del chiamante.
Io la uso solo per prendere delle funzioni interne della DLL e basta!
Ma va in errore anche se eseguo:
LoadLibrary(...);
FreeLibrary(...); <-- violazione di accesso all'indirizzo 0x000000000!!!
Come vedi non faccio neanche il reperimento di una funzione!