UTILIZZARE IN UNO SCRIPT VBSCRIPT O JAVASCRIPT UN METODO DI UN OGGETTO...

giovedì 12 giugno 2008 - 18.22

JUPITERCSC Profilo | Newbie

CREATO IL CONTROLLO ACTIVE X DI NOME UserControl1, HO AGGIUNTO UN MODULO DI CLASSE (NOME DELLA CLASSE: CLASS1)
CONTENENTE IL SEGUENTE CODICE:

Public Sub VisualizzaMes(ByVal Messaggio As Variant)
Dim MsgBResult As Integer
MsgBResult = MsgBox(Messaggio, vbInformation + vbOKOnly, "Messaggio")

1111x644 232Kb

End Sub

in seguito ho creato una pagina asp contenente il seguente codice:
<%
Dim vbOcx
Set vbOcx = Server.CreateObject("Progetto1.UserControl1")
vbOcx.VisualizzaMes("Ciao")

%>

vorrei che avviata, la pagina asp, venisse visualizzato nella classica messagebox di visual basic 6 il messaggio passato come
argomento

1111x644 232Kb
al metodo "VisualizzaMes()" dell' oggetto vbOcx
Tengo a precisare che il file ocx ha nome "Progetto1.ocx", che il componente e' stato perfettamente registrato con l'utility
"regsvr32.exe"utilizzando la sintassi "regsvr32 Progetto1.ocx".
C'è qualcuno che mi sa dire dove sbaglio?
Grazie

BY JUPITERCSC

Brainkiller Profilo | Guru

Mi sa che hai parecchia confusione in testa

Allora in genere uno usercontrol non è fatto per emettere MessageBox. Hai mai visto una TextBox, una ListBox o altro che fanno apparire una MessageBox se clicchi in modo errato ? Al massimo appare perchè il programmatore dentro il programma ha deciso così ma il codice della MessageBox non risiede nello UserControl.

>vorrei che avviata, la pagina asp, venisse visualizzato nella
>classica messagebox di visual basic 6 il messaggio passato come
>argomento al metodo "VisualizzaMes()" dell' oggetto vbOcx

Qui passiamo in un contesto Web, altro discorso. In questo caso ci sono limiti a livello di security e non è detto che tutto ciò che è possibile fare al di fuori del browser possa essere fatto all'interno.

>Tengo a precisare che il file ocx ha nome "Progetto1.ocx", che
>il componente e' stato perfettamente registrato con l'utility
>"regsvr32.exe"utilizzando la sintassi "regsvr32 Progetto1.ocx".
>C'è qualcuno che mi sa dire dove sbaglio?

Poi vedo che usi una Server.CreateObject, quindi al massimo la MessageBox se appare dovrebbe apparire sul server, tu invece la vuoi far apparire sul client. In questo caso bisogna istanziare l'oggetto diversamente con un tag <object all'interno della pagina HTML oppure via Javascript con un new ActiveXObject() ma in questo caso l'OCX dovrebbe essere registrato sul client.

Non so cosa tu voglia fare, ma la soluzione che stai implementando è concettualmente sbagliata e che io sappia non l'ho mai vista in produzione in nessuna azienda.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

JUPITERCSC Profilo | Newbie

vOLEVO SAPERE SE CI FOSSE COMUNQUE UN METODO PER RAGGIUNGERE IL MIO OBIETTIVO. INSISTO PERCHè HO VISTO UN LISTATO SIMILE A QUESTO:
<H1>BEFORE YOU RUN THIS...</H1>
Edit this file's line #15 to provide the path to the directory the DLLs are in.
<P>
<body onunload="UnloadControl()">
<input type=button value="PHP Info" onclick="PHPInfoButton()">
<input type=button value="Math Button" onclick="MathButton()">
<P>
<form name=form1>
<textarea name=atext rows=30 cols=60></textarea>

</form>

<script language=JavaScript>
var php = new ActiveXObject("PHPXControl.PHPX");
php.DLLFolder = "H:\\PHPX\\";

function PHPInfoButton()
{
var result = php.RunCode("phpInfo();");
document.form1.atext.value = result;
}

function MathButton()
{
var result = php.RunCode("$a=22; $b=39; print \"$a+$b=\"; print $a+$b;");
window.alert(result);
}

function UnloadControl()
{
php.FinalizeControl();
php=null;
}
</script>
NEL QUALE COMPARE ESPLICITAMENTE CHE VENGONO UTILIZZATI METODI QUALI "RunCode("phpInfo();");" PROPRI
DELL' OGGETTO php istanzianto grazie alla funzione CreateActivexObject. tutto ciò che vorrei sapere è quali istruzioni devo
inserire nel controllo ocx affinchè i metodi come "RunCode("phpInfo();");" possano da javascript o vbscript essere eseguiti.
BY JUPITERCSC

Brainkiller Profilo | Guru

>istanzianto grazie alla funzione CreateActivexObject.
>tutto ciò che vorrei sapere è quali istruzioni devo

Appunto è ciò che ti ho indicato anche io di usare new ActiveXObject()

>inserire nel controllo ocx affinchè i metodi come "RunCode("phpInfo();");"
>possano da javascript o vbscript essere eseguiti.

Allora il progetto di cui hai bisogno non è uno UserControl ma una ActiveX DLL. Fai New su VB6.0 e scegli ActiveX DLL.
Questa dovrà essere poi registrata su ogni computer dove aprirai la pagina .asp
Ultima cosa non usare la MsgBox perchè non funzionerà ma usa metodi tradizionali con input/output di parametri.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

JUPITERCSC Profilo | Newbie

input/output di parametri A COSA TI RIFERISCI?
E COMUNQUE IL MIO OCXERA SOLO UN ESEMPIO. MI STAVO ESERCITANDO PER CAPIRE COME FARE PER SCRIVE CONTROLLI,
I CUI METODI POTESSERO ESSERE RICHIAMATI DA PAGINE WEB. E COMUNQUE DATA LA MIA NECESSITA' DI DISPORRE DI UNA
INTERFACCIA VISIVA (GUI) MI SPINGE A SCARTARE LA SUA PROPOSTA DI CREARE UN CONTROLLO ACTIVEX DLL PROPOSTA CHE
COMUNQUE E' VALIDA PER L' ESEMPIO CHE ABBIAMO FATTO PRIMA. FACCIO UN ESEMPIO. SUPPONIAMO DI AVER CREATO UN
CONTROLLO ACTIVEX CHE CONTENGA UN CONTROLLO CALENDAR TIPO QUELLO DI SEGUITO RIPORTATO NELLA FIGURA:


1266x687 363Kb


ALL'INTERNO DEL CONTROLLO COMPARE IL SEGUENTE CODICE:



Private Sub UserControl_Initialize()
Calendar1.AboutBox
End Sub


VORREI PER ESEMPIO CHIAMARE IL METODO aboutBox() da uno script javascript o vbscript.
so bene che una volta creato il file .ocx è sufficiente aggiungere un tag object nella pagina html che interpretare affinchè il
controllo da noi creato venga visualizzato. Ma il punto della questione è che non è possibile richiamare alcun metodo data la
natura ontologica dei tag html. L'unica soluzione sarebbe istanziare un oggetto con il la funzione CreateObject o
CreateActivexObject e poi chiamare il metodo interessato dell' oggetto, nel nostro caso AboutBox. Mi piacere sapere quali
sono le intruzioni da inserire nel controllo affinchè il metodo che io vado a creare possa essere richiamato da uno script
javascript o vbscript. L'esempio appena fatto fa riferimento a un progettino i cui sorgenti sono salvati nel file allegato,
il cui nome è 677_ESEMPIO_cONTROLLO_CALENDAR.zip (677). Se qualcuno conosce la soluzione può anche modificare i sorgenti
e chiamarmi affinchè io possa scaricarli. Farò un altro esempio.
Sulla rivista io programmo del gennaio 2004 n.1 (76) ho letto un articolo relativo a componenti .net da utilizzare in applicazioni
com. Il codice presente nel file da compilare è il seguente:


File Automobile.cs:

using System;
using System.Runtime.InteropServices;

//richiedo l'esposizione a COM come interfaccia duale
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IVeicolo
{
int Speed{get;}
int Accelera(int s);
int Frena(int s);
int Frena();
}

[ClassInterface(ClassInterfaceType.None)]
public class Automobile: IVeicolo
{
private int speed;
private readonly int maxSpeed=180;

/// <summary>
/// Il costruttore di default è richiesto da COM
/// </summary>
public Automobile()
{
speed=0;
}

public int Accelera(int s)
{
if(speed+s<maxSpeed)
speed+=s;
else speed=maxSpeed;
return speed;
}

public int Frena(int s)
{
if(speed-s>0)
speed-=s;
else speed=0;
return speed;
}

public int Frena()
{
if(speed>0)
speed--;
else speed=0;
return speed;
}

public int Speed
{
get
{
return speed;
}
}

[ComVisible(false)]
public void MetodoNascosto()
{
//non fa nulla
}

public static void MetodoStatico()
{
//non fa nulla
}
}




nel file AssemblyInfo.cs è presente il seguente codice:

using System.Reflection;
using System.Runtime.CompilerServices;

//
// Le informazioni generali relative a un assembly sono controllate dal seguente
// insieme di attributi. Per modificare le informazioni associate a un assembly
// occorre quindi modificare i valori di questi attributi.
//
[assembly: AssemblyTitle("")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

//
// Le informazioni sulla versione di un assembly sono costituite dai seguenti valori:
//
// Numero di versione principale
// Numero di versione secondario
// Numero revisione
// Numero build
//
// È possibile specificare tutti i valori oppure impostare valori predefiniti per i numeri relativi alla revisione e alla build
// utilizzando il carattere "*" come mostrato di seguito:

[assembly: AssemblyVersion("1.0.1.0")]

//
// Per firmare l'assembly è necessario specificare una chiave da utilizzare.
// Fare riferimento alla documentazione di Microsoft .NET Framework per ulteriori informazioni sulla firma degli assembly.
//
// Utilizzare gli attributi elencati di seguito per verificare la chiave utilizzata per la firma.
//
// Note:
// (*) Se non è specificata alcuna chiave, non sarà possibile firmare l'assembly.
// (*) KeyName fa riferimento a una chiave installata nel provider di servizi di
// crittografia (CSP) sul computer in uso. KeyFile fa riferimento a un file che contiene
// una chiave.
// (*) Se entrambi i valori KeyFile e KeyName sono specificati, si
// verificherà il seguente processo:
// (1) Se KeyName è presente in CSP, verrà utilizzata tale chiave.
// (2) Se KeyName non esiste e KeyFile esiste, la chiave
// di KeyFile verrà installata nel CSP e utilizzata.
// (*) Per creare un KeyFile, è possibile utilizzare l'utilità sn.exe (Strong Name).
// Quando si specifica il KeyFile, il percorso dovrà essere
// relativo alla directory di output del progetto, ovvero
// %Project Directory%\obj\<configuration>. Se ad esempio il KeyFile si
// trova nella directory del progetto, occorre specificare l'attributo AssemblyKeyFile
// come [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
// (*) La firma ritardata è un'opzione avanzata. Vedere la documentazione di Microsoft
// .NET Framework per ulteriori informazioni.
//
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("..\\..\\chiave.snk")]
[assembly: AssemblyKeyName("")]










BY JUPITERCSC

Brainkiller Profilo | Guru

> input/output di parametri A COSA TI RIFERISCI?

Un metodo tradizionale:

int Somma(int a, int b) { return a+b; }

senza usare istruzioni che richiedono interazione come la MsgBox.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

JUPITERCSC Profilo | Newbie

mi faresti un controllo activex semplice in vb6 i cui metodi sono richiamabili da script javascript o vbscpt in modo che io possa imparare? grazie

BY JUPITERCSC

JUPITERCSC Profilo | Newbie

come stavo dicendo l'articolo di io programmo
BY JUPITERCSC

Brainkiller Profilo | Guru

>mi faresti un controllo activex semplice in vb6 i cui metodi
>sono richiamabili da script javascript o vbscpt in modo che io
>possa imparare? grazie

Io VB6 non lo uso da 6 o 7 anni.

L'articolo che hai allegato è carino ed è spiegato bene. Solo che la DLL è stata creata con .NET.
Il processo è analogo anche con VB6.0 come ti ho consigliato è sufficiente creare un progetto ActiveX DLL creare dei metodi compilare la DLL e registrarla e poi usare lo stesso sitema di instanziamento via Javascript usato nell'articolo.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5