Archive pour la catégorie ‘VB’

Add VBScript into C++ Application

Mardi 16 juin 2015

How to add Scripting possibility, under windows with VBScript.

[sourcecode language="cpp"]
#include <windows.h>
#include <OleAuto.h>
#include <stdio.h>
#include <comutil.h>
#pragma comment (lib, "OleAut32.lib")
#pragma comment (lib, "comsuppw.lib")

#import "msscript.ocx"

MSScriptControl::IScriptProcedurePtr GetScriptFunction(MSScriptControl::IScriptControlPtr pScript, LPCTSTR szName)
{
MSScriptControl::IScriptProcedureCollectionPtr pIProcedures = pScript->GetProcedures();
long count = pIProcedures->GetCount();
for(long index=1; index <= count; index++)
{
MSScriptControl::IScriptProcedurePtr pIProcPtr = pIProcedures->GetItem( _variant_t(index) );
_bstr_t name = pIProcPtr->GetName();
if ( lstrcmp( name, szName ) == 0 )
return pIProcPtr ;
pIProcPtr = NULL;
}
return NULL ;
}

void create_script()
{
CoInitialize(NULL);
MSScriptControl::IScriptControlPtr m_pScript ;
HRESULT hr = m_pScript.CreateInstance(__uuidof(MSScriptControl::ScriptControl));

m_pScript->PutAllowUI( VARIANT_TRUE );
m_pScript->PutLanguage( _bstr_t(L"VBScript") );

_variant_t obj(1.2345);

wchar_t code[] = L"Function Toto()\nToto = 1.2345\nEnd Function" ;
hr = m_pScript->AddCode( _bstr_t(code) );

MSScriptControl::IScriptProcedurePtr pFunc = GetScriptFunction(m_pScript,L"Toto");

SAFEARRAY *parameters = ::SafeArrayCreateVector( VT_VARIANT, 0, 0 );

_variant_t ret = m_pScript->Run( _bstr_t("Toto"), &parameters );

_bstr_t bv(ret);
wprintf(L"%s\n", bv.GetBSTR());
}

int main(int argc, char** argv)
{
create_script();
}
[/sourcecode]

VBScript passage de tableau par reference

Jeudi 27 mars 2014

Comment faire communiquer un Object COM en C++ avec un VBScript :

IDL :
[sourcecode]
library EngineLib
{
dispinterface _IEngineEvents
{
[id(27)] HRESULT MyCallBack( [in,out] VARIANT* arr);
}
}
[/sourcecode]
Le code de l’objet COM C++:
[sourcecode language="cpp"]SAFEARRAY *pSafeArray = ::SafeArrayCreateVector( VT_VARIANT, 0, 1 );
LONG indices = 0 ;
_variant_t v0(L"Hello");
::SafeArrayPutElement( pSafeArray, &indices, &v0 );
VARIANT variant;

VariantInit( &variant );
variant.pparray = &pSafeArray;
variant.vt = VT_BYREF|VT_ARRAY|VT_VARIANT;

CComVariant pVars[1] ;
pVars[0].pvarVal = &variant;
pVars[0].vt = VT_BYREF|VT_VARIANT;

fire( pVars, 1, 27 );
[/sourcecode]
La Fonction fire:
[sourcecode language="cpp"]void fire( CComVariant* pVars, int size, int invoke )
{
CComVariant varResult;
int s = ConnectionPoint.GetSize();
for (int nConnectionIndex=0;nConnectionIndex<s; nConnectionIndex++)
{
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
EXCEPINFO excepinfo ;
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if ( pDispatch )
{
VariantClear(&varResult);
DISPPARAMS disp = { pVars, NULL, size, 0 };
HRESULT hr = pDispatch->Invoke( invoke, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, &excepinfo, NULL);
}
}
}[/sourcecode]
Le code VBScript:
[sourcecode language="vb"]Function IEngineEvents_MyCallBack( ByRef arr ) ‘Function name is very important
WScript.Echo "arr=" & arr(0)
ReDim Preserve arr(UBound(arr) + 1)
arr(0) = "A1"
arr(1) = "A2"
End Function

Set engine = WScript.CreateObject("MyComComponent", "IEngineEvents_")
‘This function call MyCallBack indirectly
engine.CallCallBack
[/sourcecode]

VBScript upload de fichier

Mercredi 19 décembre 2012

La plupart des exemples sur internet utilise la méthode put pour envoyer des fichiers en upload sur un serveur web. Voici un script qui permet de le faire avec Content-Disposition: form-data.
[sourcecode language="vb"]Function UploadFile( url, file, fileType )

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")

Dim boundary
boundary = "12345678"

Set objStream = CreateObject("ADODB.Stream")
objStream.Type = 1 ‘ binary
objStream.Open
objStream.LoadFromFile(file)

‘Stream de text
Set sOut = CreateObject("ADODB.Stream")
sOut.Charset = "us-ascii"
sOut.Type = 2 ‘ Text
sOut.Open
sOut.WriteText "–" & boundary & vbCrLf
sOut.WriteText "Content-Disposition: form-data; name=""file""; filename="""&file&"""" & vbCrLf
sOut.WriteText "Content-Type: " & fileType & vbCrLf & vbCrLf

Set sOut2 = CreateObject("ADODB.Stream")
sOut2.Charset = "us-ascii"
sOut2.Type = 2 ‘ Text
sOut2.Open
sOut2.WriteText vbCrLf & "–" & boundary & "–" & vbCrLf & vbCrLf

Set sAll = CreateObject("ADODB.Stream")
sAll.Type = 1 ‘binary
sAll.Open
sOut.Position = 0
sOut.CopyTo sAll
objStream.CopyTo sAll
sOut2.Position = 0
sOut2.CopyTo sAll

oXMLHTTP.Open "POST", url, False
oXMLHTTP.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & boundary
oXMLHTTP.setRequestHeader "Connection", "close"
oXMLHTTP.setRequestHeader "Content-length", sAll.Size
sAll.Position = 0
oXMLHTTP.Send sAll.Read()
Wscript.Echo "Upload-Status: " & oXMLHTTP.statusText
End Function

UploadFile "http://upload.server/upload.php", "Configurations.zip", "application/x-zip-compressed"[/sourcecode]