Advertisement
Guest User

MSScriptControl.cpp

a guest
Mar 25th, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <comutil.h>
  4. #include <windows.h>
  5. #include <wchar.h>
  6. #include <algorithm>
  7. #include <string>
  8. #include <vector>
  9.  
  10. #if _WIN64
  11.     #import "C:\Windows\SysWOW64\msscript.ocx"  // msscript.ocx
  12. #elif _WIN32
  13.     #import "C:\Windows\System32\msscript.ocx"  // msscript.ocx
  14. #endif
  15.  
  16. using namespace MSScriptControl;
  17. using namespace std;
  18.  
  19. #define DLL extern "C" _declspec(dllexport)
  20.  
  21. typedef basic_string<WCHAR> tstring;
  22. tstring widen(string str)
  23. {
  24.     const size_t wchar_count = str.size() + 1;
  25.     vector<WCHAR> buf(wchar_count);
  26.     return tstring{ buf.data(), (size_t)MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, buf.data(), wchar_count) };
  27. }
  28.  
  29. string shorten(tstring str)
  30. {
  31.     int nbytes = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), (int)str.length(), NULL, 0, NULL, NULL);
  32.     vector<char> buf((size_t)nbytes);
  33.     return string{ buf.data(), (size_t)WideCharToMultiByte(CP_UTF8, 0, str.c_str(), (int)str.length(), buf.data(), nbytes, NULL, NULL) };
  34. }
  35.  
  36. DLL double GetSitehWnd()
  37. {
  38.     return (long)GetAncestor(GetActiveWindow(), GA_ROOTOWNER);
  39. }
  40.  
  41. DLL double ExecuteStatement(char *Statement, char *Language)
  42. {
  43.     HRESULT hr = CoInitialize(NULL);
  44.  
  45.     IScriptControlPtr pScriptControl(__uuidof(ScriptControl));
  46.  
  47.     // Create a VARIANT array of VARIANTs which hold BSTRs
  48.     LPSAFEARRAY psa;
  49.     SAFEARRAYBOUND rgsabound[] = { 3, 0 }; // 3 elements, 0-based
  50.     int i;
  51.  
  52.     psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
  53.     if (!psa)
  54.     {
  55.         return E_OUTOFMEMORY;
  56.     }
  57.  
  58.     VARIANT vFlavors[3];
  59.     for (i = 0; i < 3; i++)
  60.     {
  61.         VariantInit(&vFlavors[i]);
  62.         V_VT(&vFlavors[i]) = VT_BSTR;
  63.     }
  64.  
  65.     V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"));
  66.     V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"));
  67.     V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip"));
  68.  
  69.     long lZero = 0;
  70.     long lOne = 1;
  71.     long lTwo = 2;
  72.  
  73.     // Put Elements to the SafeArray:
  74.     hr = SafeArrayPutElement(psa, &lZero, &vFlavors[0]);
  75.     hr = SafeArrayPutElement(psa, &lOne, &vFlavors[1]);
  76.     hr = SafeArrayPutElement(psa, &lTwo, &vFlavors[2]);
  77.  
  78.     // Free Elements from the SafeArray:
  79.     for (i = 0; i < 3; i++)
  80.     {
  81.         SysFreeString(vFlavors[i].bstrVal);
  82.     }
  83.  
  84.     // Set up Script control properties
  85.     tstring wstrLanguage = widen(Language);
  86.     _bstr_t bstrLanguage = SysAllocString(wstrLanguage.c_str());
  87.     pScriptControl->Language = bstrLanguage;
  88.     pScriptControl->SitehWnd = (long)GetSitehWnd();
  89.     pScriptControl->AllowUI = TRUE;
  90.     SysFreeString(bstrLanguage);
  91.  
  92.     //  Execute Statement:
  93.     tstring wstrStatement = widen(Statement);
  94.     _bstr_t bstrStatement = SysAllocString(wstrStatement.c_str());
  95.     pScriptControl->ExecuteStatement(bstrStatement);
  96.     SysFreeString(bstrStatement);
  97.  
  98.  
  99.     //  Clean up:
  100.     SafeArrayDestroy(psa);
  101.  
  102.     CoUninitialize();
  103.     return 0;
  104. }
  105.  
  106. DLL char *EvaluateExpression(char *Expression, char *Subroutine, char *Language)
  107. {
  108.     HRESULT hr = CoInitialize(NULL);
  109.  
  110.     IScriptControlPtr pScriptControl(__uuidof(ScriptControl));
  111.  
  112.     // Create a VARIANT array of VARIANTs which hold BSTRs
  113.     LPSAFEARRAY psa;
  114.     SAFEARRAYBOUND rgsabound[] = { 3, 0 }; // 3 elements, 0-based
  115.     int i;
  116.  
  117.     psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
  118.     if (!psa)
  119.     {
  120.         return (char *)E_OUTOFMEMORY;
  121.     }
  122.  
  123.     VARIANT vFlavors[3];
  124.     for (i = 0; i < 3; i++)
  125.     {
  126.         VariantInit(&vFlavors[i]);
  127.         V_VT(&vFlavors[i]) = VT_BSTR;
  128.     }
  129.  
  130.     V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"));
  131.     V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"));
  132.     V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip"));
  133.  
  134.     long lZero = 0;
  135.     long lOne = 1;
  136.     long lTwo = 2;
  137.  
  138.     // Put Elements to the SafeArray:
  139.     hr = SafeArrayPutElement(psa, &lZero, &vFlavors[0]);
  140.     hr = SafeArrayPutElement(psa, &lOne, &vFlavors[1]);
  141.     hr = SafeArrayPutElement(psa, &lTwo, &vFlavors[2]);
  142.  
  143.     // Free Elements from the SafeArray:
  144.     for (i = 0; i < 3; i++)
  145.     {
  146.         SysFreeString(vFlavors[i].bstrVal);
  147.     }
  148.  
  149.     // Set up Script control properties
  150.     tstring wstrLanguage = widen(Language);
  151.     _bstr_t bstrLanguage = SysAllocString(wstrLanguage.c_str());
  152.     pScriptControl->Language = bstrLanguage;
  153.     pScriptControl->SitehWnd = (long)GetSitehWnd();
  154.     pScriptControl->AllowUI = TRUE;
  155.     SysFreeString(bstrLanguage);
  156.  
  157.     //  Add Subroutine Code:
  158.     tstring wstrSubroutine = widen(Subroutine);
  159.     _bstr_t bstrSubroutine = SysAllocString(wstrSubroutine.c_str());
  160.     pScriptControl->AddCode(bstrSubroutine);
  161.     SysFreeString(bstrSubroutine);
  162.  
  163.     //  Evaluate Expression:
  164.     tstring wstrExpression = widen(Expression);
  165.     _bstr_t bstrExpression = SysAllocString(wstrExpression.c_str());
  166.     _variant_t Evaluation = pScriptControl->Eval(bstrExpression);
  167.     SysFreeString(bstrExpression);
  168.  
  169.  
  170.     // Convert VARIANT to BSTR:
  171.     static _bstr_t stcbstrResult;
  172.     stcbstrResult = (_bstr_t)Evaluation;
  173.     tstring wstrResult = widen((char *)stcbstrResult);
  174.     _bstr_t bstrResult = SysAllocString(wstrResult.c_str());
  175.     wstrResult = widen((char *)bstrResult);
  176.     SysFreeString(bstrResult);
  177.  
  178.     //  Clean up:
  179.     SafeArrayDestroy(psa);
  180.  
  181.     CoUninitialize();
  182.  
  183.     static string strResult;
  184.     strResult = shorten(wstrResult.c_str());
  185.     return (char *)strResult.c_str();
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement