Newsgroup: it.comp.lang.visual-basic
Titolo: puntatori

Ho un problema che ancora non sono riuscito a risolvere e forse quancuno di
voi mi può aiutare...
devo riuscire a registrare un server ole contenuto in una dll activex
compilata regolarmente con vb6
La dll contiene una classe che a me interessa...
nell'msdn ho trovato la procedura utilizzata per registrare attraverso il
codice, una qualunque dll activex...
ecco la parte principale:
HINSTANCE hLib = LoadLibrary (pszdllName); // carica la dll in memoria
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
 DisplayMessage(IDS_LOADLIBFAILED, pszDllName); // dll non caricata
 iReturn = FAIL_LOAD;
}
// trova il punto di ingresso
(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, _T("DllRegisterServer"));
if (lpDllEntryPoint != NULL)
 (*lpDllEntryPoint) ();
else
// impossibile stabilire il punto di ingresso.
in pratica succede questo..
viene caricata la libreria, viene definito in lpDllEntryPoint l'indirizzo
relativo alla funzione DllRegisterServer ed infine, se esiste, si richiama
tale funzione.
In visual basic ho fatto così:
in un modulo .bas ho inserito questo codice:
Public Declare Function LoadLibrary Lib "kernel32" Alias _
    "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function GetProcAddress Lib "kernel32" _
    (ByVal hModule As Long, ByVal lpProcName As String) _
    As Long
Public Sub Registrazione(Stringa As String)
    Dim hlib As Long 'valore di loadlibrary
    Dim lpIndirizzo As Long ' indirizzo della funzione dllregisterserver
    hlib = LoadLibrary(Stringa)
    lpLibIndirizzo = GetProcAddress(hlib, "DllRegisterServer")
    ??????
End Sub
ecco il problema...
in C quando bisogna trattare una variabile come se fosse un puntatore basta
far precedere un asterisco davanti la variabile, (nel nostro caso
"(*lpDllEntryPoint) ();" vuol dire tratta questa variabile long come un
indirizzo di memoria della funzione DllRegisterServer e chiamala senza
passare alcun parametro).
In Vb ho visto che i puntatori di funzioni si possono utilizzare attraverso
la chiave AddressOf, ma se non ho capito male, bisogna definire la funzione
prima di poterla utilizzare.
Questa necessità per me non è accettabile, dato che non conosco il nome
della dll se non in fase di esecuzione.
Un altro metodo che forse potrebbe andare è quello di utilizzare la funzione
DllSelfRegister, ma non so come usarla... (e non sono sicuro che sia
pienamente utilizzabile all'interno di activex che non siano "EXE")
Accetto qualunque consiglio e premetto che:
Per registrare la dll non posso servirmi del file regsvr32.exe perchè ho la
necessità di controllare la registrazione (cosa che non posso fare con un
componente esterno);
ringrazio tutti coloro che mi daranno una mano... o un piede, un occhio ecc
ecc.... :)


In casi estremi puo' anche essere necessario tapparsi occhi, naso, bocca,
etc... ed ingoiare il rospo (leggi: utilizzare soluzioni per nulla
eleganti). Credo che in questo caso ci siano soluzioni accettabili e
possibili, ma a mali estremi, sai che puoi contare su REGSVR32.EXE (che,
comunque, mi pare abbia un valore di ritorno, che forse si puo' utilizzare
per sapere _dal tuo programma_ il risultato dell'operazione).
Roal Zanazzi