Newsgroup: it.comp.lang.visual-basic
Titolo: [?] REGSVR32

Esiste un funzione API equivalente al comando REGSVR32 del DOS?
Il sorgente del Wizard sembra utilizzare una funzione esportata di un DLL
propria... quindi non mi va bene. Probabile che esiste una miscuglio di
funzioni API per tale scopo.
Grazie
Lorenzo

 ha scritto nel messaggio
news:zuNj6.37323$Uj1.3...@twister2.tin.it...

Non vorrei dire una idiozia grossa come una casa (casa della parte morbida,
tipo M$ :-P)
ma forse basta chiamare le API
    DllRegisterServer()
    DllUnregisterServer()
esportate della OCX stessa che vuoi registrare.
l'MSDN mi dice questo:
----------------------------------------------------
DllRegisterServer
Instructs an in-process server to create its registry entries for all
classes supported in this server module. If this function fails, the state
of the registry for all its classes is indeterminate.
STDAPI DllRegisterServer(void);
Return Values
This function supports the standard return values E_OUTOFMEMORY and
E_UNEXPECTED, as well as the following:
S_OK
The registry entries were created successfully.
SELFREG_E_TYPELIB
The server was unable to complete the registration of all the type libraries
used by its classes.
SELFREG_E_CLASS
The server was unable to complete the registration of all the object
classes.
Remarks
E_NOTIMPL is not a valid return code.
..
....
..
----------------------------------------------------
DllUnregisterServer
Instructs an in-process server to remove only those entries created through
DllRegisterServer.
STDAPI DllUnregisterServer(void);
Return Values
This function supports the standard return values E_OUTOFMEMORY and
E_UNEXPECTED, as well as the following:
S_OK
The registry entries were created successfully.
S_FALSE
Unregistration of this server's known entries was successful, but other
entries still exist for this server's classes.
SELFREG_E_TYPELIB
The server was unable to remove the entries of all the type libraries used
by its classes.
SELFREG_E_CLASS
The server was unable to remove the entries of all the object classes.
...
.. . . .
..
----------------------------------------------------
--
/\/\/\/\/\/\/\/\/\/\/\/\/
|  Partecipa alla stesura di progetti VB sviluppati in team,
|  informati sul Sito Comune sezione Leonardo. Io
|  partecipo al progetto Data Raptor, alleati con noi.
\/\/\/\/\/\/\/\/\/\/\/\/\
Ciao
Ettore Maronese, il Mes
http://www.maronese.com/mes
Sito Comune di questo NG
http://www.murialdo.it/it_lang_vb

miscuglio di funzioni API per tale scopo.
no, no e no
č solo VB che č limitato
se VB supportasse i tipi procedurali dovresti fare qualcosa del genere:
'questo e' impossibile in VB, purtroppo
Dim Function DllRegisterServer As Long
Dim handle As Long, ret As Long
handle = LoadLibrary("dlldaregistrare.dll")
DllRegisterServer = GetProcAddress(handle, "DllRegisterServer")
ret = DllRegisterServer
FreeLibrary handle
dato che VB NON supporta i tipi di dati procedurali, dovrai fare cosě:
Dim handle As Long, ret As Long, proc As Long
handle = LoadLibrary("dlldaregistrare.dll")
proc = GetProcAddress(handle, "DllRegisterServer")
ret = CallWindowProc(proc, ByVal 0&, ByVal 0&, ByVal 0&, ByVal 0&)
FreeLibrary handle


hehehe... bella, sporca ma bella.
Tu conta che le funzioni API presenti nelle DLL (ed in generale tutte le
funzioni tipo CallBack) vengono
chiamate con lo standard pascall, che prevede che sia la funzione chiamata a
liberare i paramentri dallo stack,
e dato che tu chiami una funzione con un numero/tipo di parametri differenti
da quello che si aspetta, si
dovrebbe crasciare (andare il crash) tutto.
Comunque non avendo mai provato.. . .   non credo, ma magari funziona.


 FreeLibrary handle
libera la memoria allocata

 Lorenzo
Non puoi!
Appunto, per il motivo che dicevo nella scorsa mail.
Ti devi ritenete + che fortunato che vb riesca ad intercettare il
disallineamento dello stack, altrimenti ti andava tutto in crash!
E' giusto che la registrazione avvenga correttamente, perchè il
disallineamento dello stack sopraggiunge quando la funzione
DllRegisterServer ha terminato e torna senza liberare correttamente lo
stack.
Visto che VB intercetta l'errore, forse se usi un ON ERROR puoi far finta di
niente.. .



Che io sappia il bad dll calling convention esiste solo in runtime, cmq si
puo' provare.
Al limite si puo' usare un programma a parte che chiami la funzione ed esca
(con una exitprocess) in modo da evitare il crash, oppure chiamare il tutto
direttamente dalla sub main, come ultima istruzione prima di chiudere il
programma.
Tutte le soluzioni dovrebbero efficacemente risolvere il problema... Cmq
c'e' sempre la soluzione Declare, qualora la DLL da registrare sia nota a
priori (ovvero a compile time).
Ciaotutti,
Alessandro