Newsgroup: it.comp.programmare.win32
Titolo: Visual C++ e 'msscript.ocx'.

Ho bisogno di sapere se é possibile utilizzare correttamente tutte le
funzionalità della libreria 'msscript.ocx' in un programma a console
scritto in VC++.
Il programma che ho creato legge degli script scritti in VBS da dei
file esterni e li esegue, senza alcuna interazione con il programma e
per adesso senza alcun passaggio di parametri.
Lo script con cui ho intenzione di fare la prima prova é molto banale,
una cosa tipo
Function funct1()
    Msgbox "HELLO WORLD"
End Function
Ebbene, senza stare a perdere troppo tempo, il corpo principale del
programma é questo...
CoInitialize(0);
//'msscript1' é l'istanza dell'oggetto VBScript.
IScriptControlPtr msscript1(__uuidof(ScriptControl));
msscript1->PutLanguage("VBscript");
if(fileexists(filen))
	{
	try
		{
		wrappascript(filen);
		impostacodicescript(wrapscript,msscript1);
		esegui(msscript1);
		}
	catch(std::exception &err)
		{
		std::cout<<"ERRORE: "<<err.what()<<std::endl;
		}
	}	
else
	{
	std::cout<<"Err:il file '"<<filen<<"' non esiste\n";
	exit(1);
	}
L'oggetto viene correttamente inizializzato, i metodi 'PutLanguage',
'Reset' e 'AddCode' funzionano,il codice letto nel file viene
impostato nel controllo ma il metodo 'Run' che dovrebbe eseguire lo
script(ed in questo caso mostrare un MessageBox)non funziona e lancia
un eccezione di tipo '_com_error' inspiegabile. Per la precisione...
void esegui(IScriptControlPtr &iscrctrl)
	{
	//Esegue codice dello script.
	try
		{
		//imposta parametri.
		SAFEARRAY *par1=new SAFEARRAY;
		tagSAFEARRAYBOUND tsab1[1];
		tsab1[0].cElements=0;
		tsab1[0].lLbound=0;
		par1->cbElements=0;
		par1->cDims=0;
		par1->cLocks=0;
		par1->fFeatures=0;
		par1->pvData=NULL;
		par1->rgsabound[0]=tsab1[0];
		iscrctrl->Run("funct1",&par1);
		}
	catch(_com_error &err1)
		{
		std::cout<<"ERROR="<<err1.Error<<std::endl;
		std::cout<<"ERRORINFO="<<err1.ErrorInfo<<std::endl;
std::cout<<"ERRORMESSAGE="<<err1.ErrorMessage<<std::endl;
std::cout<<"DESCRIPTION="<<err1.Description<<std::endl;
		std::cout<<"SOURCE="<<err1.Source<<std::endl;
		std::cout<<"WCODE="<<err1.WCode<<std::endl;
		std::cout<<"MS SCRIPT
ERROR="<<iscrctrl->Error<<std::endl;
		std::string mexerr="Errore nell'esecuzione dello
script";
		throw std::logic_error(mexerr);
		}
	}
Premesso che non ho capito bene come funziona la gestione dei
parametri ho provato ad impostare i dati membro di 'par1' tutti a 0(la
funct1 non accetta parametri),ho provato anche a passare al metodo
'Run' un puntatore NULL ma non ha ugualmente funzionato. Inoltre se
tento di stampare su schermo i dati membro dell'oggetto 'err1' che mi
dovrebbero restituire codice e descrizione dell'errore ottengo tutti i
parametri a 1, cosa inspiegabile. Eseguendo il debug riga per riga del
metodo 'Run' noto che ad un certo punto viene cercato un file di nome
'dbghook.c' che però nel Visual Studio (uso la Service Pack 4) non si
trova, e non sono riuscito nemmeno a trovarlo su Internet, sarà forse
per questo che il metodo non funziona?
Sarei molto felice se qualcuno mi dicesse come risolvere questo
problema, ma anche il solo sapere che é possibile far funzionare al
100% questa strana libreria mi sarebbe molto utile.
Grazie in anticipo!
Il Ghenio
-----
These are my parting words to you:
those who give up are doomed!
-----

[grande cut]
Invece di usare l'ocx dovresti usare le interf. fatte apposta:
IActiveScript: la devi ottenere
IActiveScriptSite: la devi implementare.
Ciao
--
The Secret of Tabboz Island
http://it.geocities.com/tabbozisland

Ciao
Grazie per il consiglio, ma per quel che riguarda il mio problema era
solamente un utilizzo errato della struct SAFEARRAY e dei parametri da
passare allo script, problema che ho già risolto.
