Newsgroup: it.comp.lang.visual-basic
Titolo: convertire una activex exe in una activex dll per essere richiamata con asp

bene... dopo essermi asciugato le lacrime... riesco a vedere il video!
dopo essere riuscito a creare una dll con logiche fuzzy... mi ritrovo con un
problema enorme:
ho generato un .exe che mi fa quello che deve fare:
- form con 5 campi di input
- nei 5 campi digito 5 valori che servono per far partire il calcolo della
rete neurale usando la dll cbc20r32
- il form2 visualizza i risultati!
tutto funziona alla perfezione!!!
ora però devo trasformare il tutto per essere richiamato da una pagina asp!
in sostanza non devo + avere il form in vb ma i 5 valori di input devo
arrivare dalla pagina asp e sempre in asp devo mostrare quello che mostra il
form2!
tanto per capirci incollo il listato in vb del file exe
LISTATO FORM1 (form dove ci sono i 5 campi di input)
Dim DLL_ch As Integer
Private Declare Function wfz_init Lib "cbc20r32.dll" (ByVal FName$) As
Integer
Private Declare Function wfz_eval Lib "cbc20r32.dll" (ByVal FCh%, Inp As
Double, Out As Double) As Integer
Private Declare Function wfz_close Lib "cbc20r32.dll" (ByVal Ch%) As Integer
Private Declare Function wfz_get_index Lib "cbc20r32.dll" (ByVal Ch%, ByVal
Typ%, ByVal FName$, Index%) As Integer
Private Sub Command1_Click()
Form2.Show
Form2.Print Tab(1); "Stim seek = " + Str$(CInt(varOutputs(outIndex1)))
Form2.Print Tab(1); "Opp pass = " + Str$(CInt(varOutputs(outIndex3)))
Form2.Print Tab(1); "Diffidente = " + Str$(CInt(varOutputs(outIndex5)))
Form2.Print Tab(1); "Ansioso = " + Str$(CInt(varOutputs(outIndex7)))
Form2.Print Tab(1); "Paranoico = " + Str$(CInt(varOutputs(outIndex9)))
Form2.Print Tab(1); "Schizotipico = " + Str$(CInt(varOutputs(outIndex11)))
Form2.Print Tab(1); "Narcisista 2 = " + Str$(CInt(varOutputs(outIndex13)))
End Sub
Private Sub CommFuzzy_Click()
Dim result As Integer
VarInputs(inpIndex1) = CDbl(Val(F1.Text))
VarInputs(inpIndex2) = CDbl(Val(F2.Text))
VarInputs(inpIndex3) = CDbl(Val(F3.Text))
VarInputs(inpIndex4) = CDbl(Val(F4.Text))
VarInputs(inpIndex5) = CDbl(Val(F5.Text))
result = wfz_eval(DLL_ch, VarInputs(0), varOutputs(0))
End Sub
Private Sub Form_Load()
Dim retval As Integer
DLL_ch = wfz_init("PATOL2.CBD")
If DLL_ch < 0 Then
If DLL_ch = -4 Then
dummy = MsgBox("Non recupero PATOLOG2.CBD!", 0, "RTC DLL Error")
Else
dummy = MsgBox("Errata inizializzazione", 0, "RTC DLL Error: " +
Str$(DLL_ch))
End If
End
End If
' Recupero degli indici associati alle variabili di Input
' Recupero degli indici associati alle variabili di Input
retval = wfz_get_index(DLL_ch, 1, "f1", inpIndex1)
If retval < 0 Then
dummy = MsgBox("Non recupero l'indice di f1!", 0, "RTC DLL Error" +
Str$(retval))
End
End If
retval = wfz_get_index(DLL_ch, 1, "f2", inpIndex2)
If retval < 0 Then
dummy = MsgBox("Non recupero l'indice di f2!", 0, "RTC DLL Error" +
Str$(retval))
End
End If
retval = wfz_get_index(DLL_ch, 1, "f3", inpIndex3)
If retval < 0 Then
dummy = MsgBox("Non recupero l'indice di f3!", 0, "RTC DLL Error" +
Str$(retval))
End
End If
retval = wfz_get_index(DLL_ch, 1, "f4", inpIndex4)
If retval < 0 Then
dummy = MsgBox("Non recupero l'indice di f4!", 0, "RTC DLL Error" +
Str$(retval))
End
End If
retval = wfz_get_index(DLL_ch, 1, "f5", inpIndex5)
If retval < 0 Then
dummy = MsgBox("Non recupero l'indice di f5!", 0, "RTC DLL Error" +
Str$(retval))
End
End If
' Recupero degli indici associati alle variabili di output
retval = wfz_get_index(DLL_ch, 2, "stimseek", outIndex1)
retval = wfz_get_index(DLL_ch, 2, "evitasoc", outIndex2)
retval = wfz_get_index(DLL_ch, 2, "opp_pass", outIndex3)
retval = wfz_get_index(DLL_ch, 2, "narcisismo", outIndex4)
retval = wfz_get_index(DLL_ch, 2, "diffidenza", outIndex5)
retval = wfz_get_index(DLL_ch, 2, "compulsiv", outIndex6)
retval = wfz_get_index(DLL_ch, 2, "ansieta", outIndex7)
retval = wfz_get_index(DLL_ch, 2, "sospett", outIndex8)
retval = wfz_get_index(DLL_ch, 2, "paran", outIndex9)
retval = wfz_get_index(DLL_ch, 2, "skiz", outIndex10)
retval = wfz_get_index(DLL_ch, 2, "skiztyp", outIndex11)
retval = wfz_get_index(DLL_ch, 2, "histrio", outIndex12)
retval = wfz_get_index(DLL_ch, 2, "narcis", outIndex13)
retval = wfz_get_index(DLL_ch, 2, "antisocial", outIndex14)
retval = wfz_get_index(DLL_ch, 2, "borderline", outIndex15)
retval = wfz_get_index(DLL_ch, 2, "avoidant", outIndex16)
retval = wfz_get_index(DLL_ch, 2, "dependent", outIndex17)
retval = wfz_get_index(DLL_ch, 2, "compulsive", outIndex18)
retval = wfz_get_index(DLL_ch, 2, "pass_aggr", outIndex19)
retval = wfz_get_index(DLL_ch, 2, "aggr_sad", outIndex20)
retval = wfz_get_index(DLL_ch, 2, "self_def", outIndex21)
retval = wfz_get_index(DLL_ch, 2, "abasem", outIndex22)
retval = wfz_get_index(DLL_ch, 2, "achiev", outIndex23)
retval = wfz_get_index(DLL_ch, 2, "affil", outIndex24)
retval = wfz_get_index(DLL_ch, 2, "aggres", outIndex25)
retval = wfz_get_index(DLL_ch, 2, "auton", outIndex26)
retval = wfz_get_index(DLL_ch, 2, "change", outIndex27)
retval = wfz_get_index(DLL_ch, 2, "cognstr", outIndex28)
retval = wfz_get_index(DLL_ch, 2, "defen", outIndex29)
retval = wfz_get_index(DLL_ch, 2, "domin", outIndex30)
retval = wfz_get_index(DLL_ch, 2, "endur", outIndex31)
retval = wfz_get_index(DLL_ch, 2, "exhib", outIndex32)
retval = wfz_get_index(DLL_ch, 2, "harmav", outIndex33)
retval = wfz_get_index(DLL_ch, 2, "impul", outIndex34)
retval = wfz_get_index(DLL_ch, 2, "nurtur", outIndex35)
retval = wfz_get_index(DLL_ch, 2, "order", outIndex36)
retval = wfz_get_index(DLL_ch, 2, "play", outIndex37)
retval = wfz_get_index(DLL_ch, 2, "sent", outIndex38)
retval = wfz_get_index(DLL_ch, 2, "socrec", outIndex39)
retval = wfz_get_index(DLL_ch, 2, "succor", outIndex40)
retval = wfz_get_index(DLL_ch, 2, "undst", outIndex41)
End Sub
LISTATO DEL MODULO
Global VarInputs(5) As Double
Global varOutputs(41) As Double
Global inpIndex1 As Integer
Global inpIndex2 As Integer
Global inpIndex3 As Integer
Global inpIndex4 As Integer
Global inpIndex5 As Integer
Global outIndex1 As Integer
Global outIndex2 As Integer
Global outIndex3 As Integer
Global outIndex4 As Integer
Global outIndex5 As Integer
Global outIndex6 As Integer
Global outIndex7 As Integer
Global outIndex8 As Integer
Global outIndex9 As Integer
Global outIndex10 As Integer
Global outIndex11 As Integer
Global outIndex12 As Integer
Global outIndex13 As Integer
Global outIndex14 As Integer
Global outIndex15 As Integer
Global outIndex16 As Integer
Global outIndex17 As Integer
Global outIndex18 As Integer
Global outIndex19 As Integer
Global outIndex20 As Integer
Global outIndex21 As Integer
Global outIndex22 As Integer
Global outIndex23 As Integer
Global outIndex24 As Integer
Global outIndex25 As Integer
Global outIndex26 As Integer
Global outIndex27 As Integer
Global outIndex28 As Integer
Global outIndex29 As Integer
Global outIndex30 As Integer
Global outIndex31 As Integer
Global outIndex32 As Integer
Global outIndex33 As Integer
Global outIndex34 As Integer
Global outIndex35 As Integer
Global outIndex36 As Integer
Global outIndex37 As Integer
Global outIndex38 As Integer
Global outIndex39 As Integer
Global outIndex40 As Integer
Global outIndex41 As Integer
ecco... spero di essere stato chiaro per quell'anima pia che ha deciso di
darmi una mano! ;-)
grazie mille

 form2!
E mandi 8kb in un NG di VB per essere trasformati in ASP?
Ammesso che qualcuno te lo faccia, non pensi che sarebbe piů adeguato un NG
di ASP?

 ha scritto nel messaggio
news:au5k85$4jdk5$1...@ID-174464.news.dfncis.de...


 VB!
Se sei riuscito a fare un ActiveX exe, fare una DLL analoga e' veramente
cosa da poco... mi viene pero' il dubbio che tu lo stia usando come un
eseguibile normale, piuttosto che come un componente, perche' di tutti i Kb
che hai mandato, curiosamente, non c'e' traccia di classi (non mandarle, per
carita' ;-) ... il sorgente non serve comunque per rispondere)
Ad ogni modo, ecco il procedimento "a braccio":
Crea almeno una classe pubblica e creabile che funga da punto di ingresso
principale; tutto quello che nella form erano campi di input diventano qui
proprieta' e/o parametri di metodi pubblici, questi ultimi a loro volta
devono fare le veci dei vari pulsanti presenti.
Tutta la parte marcata come "' Recupero degli indici associati alle
variabili di Input" potrebbe essere messa nell'inizializzazione di tale
classe, se pero' richiede un po' di tempo potrebbe essere convenientemente
spostata in una procedura a parte da richiamare solo quando e' necessario
per avere un avvio piu' snello.
Il risultato puo' essere espresso sotto forma di una seconda classe, con le
proprieta' opportune.
Tutte le forme di interazione con l'utente devono essere soppresse in favore
di eventi e/o proprieta' che forniscono i messaggi relativi (mi riferisco in
particolare a tutti i MsgBox di errore... parlando di ASP e' forse piu'
pratico evitare gli eventi e creare semplicemente una proprieta' di stato da
interrogare dopo ogni passaggio critico)
Le pagine ASP possono comportarsi grosso modo cosi':
La prima fornisce l'interfaccia di input, e volendo puo' fare a meno di
referenziare in toto la tua DLL; il classico pulsante SUBMIT dovra' quindi
invocare una seconda pagina ASP che si preoccupa di:
- Istanziare il componente
- Assegnare alla classe le proprieta' di input richieste, accedendo ai
parametri forniti dalla prima pagina (con Request.QueryString o Request.Form
a seconda di come hai fatto la chiamata) e invocare il/i metodi del caso.
- Accedere alla classe di risultato e generare dinamicamente la pagina
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown


grazie mille luca... mi sei stato di grande aiuto... e credo di aver capito
(credo?)!
ma non c'č un wizard che fa tutto questo?

 ma non c'č un wizard che fa tutto questo?
Beh, a parte il fatto che fare il programmatore e' un mestiere diverso dal
fare l'utente di wizard, ti accorgerai, facendolo, che una cosa del genere
molto ma molto difficilmente puo' essere resa in automatico...
Se la logica del tuo programma era gia' incapsulata sotto forma di classi,
allora il lavoro per passare alla DLL e' tendente allo zero, ma se, come
sembra dai tuoi sorgenti, il tutto era in moduli e form, allora devi
praticamente riscrivere il programma, aiutato da un po' di cut&paste.
Gia' che ci siamo, un paio di suggerimenti en passant:
- "Global" e' una parola chiave in via di rottamazione... fintanto che puoi,
sostituisci con "Public"; quando le variabili sono dichiarate in un modulo
BAS, l'effetto e' equivalente.
- Gia' che hai definito VarInputs e varOutputs come array, potresti rendere
piu' leggibile il tutto facendo la stessa cosa con inpIndex e outIndex


 > ma non c'è un wizard che fa tutto questo?


 ps: da dove parto ora? :-)
Da MSDN:
innanzitutto, nella "Programmer's Guide" comincia con "Programming with
Objects", passa quindi a "Programming with Components"; una volta a tuo agio
con classi e automazione di componenti esterni, puoi cominciare a creare il
tuo... qui puoi riferirti alla "Component Tools Guide" sotto "Creating
ActiveX Components"


 form2!
Per convertire un ActiveX exe in ActiveX dll basta andare nelle proprietà
del progetto e scegliere ActiveX dll :)
Ma è inutile poiuchè un Ax exe può essere usato come Ax dll senza nessuna
conversione.
Per i parametri serve una classe con un metodo che funga da passacarte:
public sub GetParams(p1 as variant, p2 as Variant ...)
--
using System.Gtk.Forms = "
http://www.neodatatype.net/windowsforms/sgf.aspx
"
mathParser = "
http://www.neodatatype.net
"
sitoComune = "
http://www.it-lang-vb.net
"