9#include <unordered_map>
14 std::string wideToUtf8(LPCOLESTR text)
19 int required = WideCharToMultiByte(CP_UTF8, 0, text, -1,
nullptr, 0,
nullptr,
nullptr);
23 std::string out(
static_cast<size_t>(required - 1),
'\0');
24 WideCharToMultiByte(CP_UTF8, 0, text, -1, out.data(), required,
nullptr,
nullptr);
36 if (riid == IID_IUnknown || riid == IID_IActiveScript)
38 *ppv =
static_cast<IActiveScript*
>(
this);
40 else if (riid == IID_IActiveScriptParse)
42 *ppv =
static_cast<IActiveScriptParse*
>(
this);
88 return site->QueryInterface(riid, ppvObject);
114 vm.reset(
true,
true,
true);
115 state = SCRIPTSTATE_CLOSED;
143 *pstidThread = SCRIPTTHREADID_BASE;
152 *pstidThread = SCRIPTTHREADID_BASE;
161 *pstsState = SCRIPTTHREADSTATE_NOTINSCRIPT;
179 vm.reset(
true,
true,
true);
181 state = SCRIPTSTATE_INITIALIZED;
203 *pbstrName =
nullptr;
230 ZeroMemory(ex,
sizeof(*ex));
234 std::string src = wideToUtf8(code);
256 if (riid == IID_IUnknown || riid == IID_IClassFactory)
258 *ppv =
static_cast<IClassFactory*
>(
this);
263 return E_NOINTERFACE;
279 HRESULT __stdcall
CreateInstance(IUnknown* pUnkOuter, REFIID riid,
void** ppv)
override
287 return CLASS_E_NOAGGREGATION;
290 HRESULT hr = engine->QueryInterface(riid, ppv);
301#if defined(__clang__)
302#pragma clang diagnostic push
303#pragma clang diagnostic ignored "-Wdll-attribute-on-redeclaration"
306#if defined(_MSC_VER) && !defined(__clang__)
308 #pragma comment(linker, "/EXPORT:DllGetClassObject=_DllGetClassObject@12,PRIVATE")
309 #pragma comment(linker, "/EXPORT:DllCanUnloadNow=_DllCanUnloadNow@0,PRIVATE")
311 #pragma comment(linker, "/EXPORT:DllGetClassObject,PRIVATE")
312 #pragma comment(linker, "/EXPORT:DllCanUnloadNow,PRIVATE")
314 #define PHASOR_COM_EXPORT
316 #define PHASOR_COM_EXPORT __declspec(dllexport)
332 return CLASS_E_CLASSNOTAVAILABLE;
335 HRESULT hr = factory->QueryInterface(riid, ppv);
347#if defined(__clang__)
348#pragma clang diagnostic pop
#define PHASOR_COM_EXPORT
PHASOR_COM_EXPORT HRESULT __stdcall DllCanUnloadNow()
PHASOR_COM_EXPORT HRESULT __stdcall DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
static const GUID CLSID_PhasorEngine
ULONG __stdcall AddRef() override
HRESULT __stdcall QueryInterface(REFIID riid, void **ppv) override
HRESULT __stdcall CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv) override
ULONG __stdcall Release() override
HRESULT __stdcall LockServer(BOOL) override
ULONG __stdcall Release() override
HRESULT __stdcall QueryInterface(REFIID riid, void **ppv) override
HRESULT __stdcall AddTypeLib(REFGUID rguidTypeLib, DWORD dwMajor, DWORD dwMinor, DWORD dwFlags) override
HRESULT __stdcall GetScriptThreadState(SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState) override
HRESULT __stdcall InterruptScriptThread(SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags) override
HRESULT __stdcall GetScriptThreadID(DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread) override
HRESULT __stdcall InitNew() override
HRESULT __stdcall AddScriptlet(LPCOLESTR defaultName, LPCOLESTR code, LPCOLESTR itemName, LPCOLESTR subItemName, LPCOLESTR eventName, LPCOLESTR delimiter, DWORD sourceContextCookie, ULONG startingLine, DWORD flags, BSTR *pbstrName, EXCEPINFO *pexcepinfo) override
HRESULT __stdcall GetCurrentScriptThreadID(SCRIPTTHREADID *pstidThread) override
HRESULT __stdcall ParseScriptText(LPCOLESTR code, LPCOLESTR itemName, IUnknown *context, LPCOLESTR delimiter, DWORD sourceContextCookie, ULONG startingLine, DWORD flags, VARIANT *result, EXCEPINFO *ex) override
HRESULT __stdcall SetScriptState(SCRIPTSTATE state) override
HRESULT __stdcall Close() override
HRESULT __stdcall Clone(IActiveScript **ppscript) override
HRESULT __stdcall GetScriptDispatch(LPCOLESTR name, IDispatch **ppdisp) override
HRESULT __stdcall SetScriptSite(IActiveScriptSite *pSite) override
HRESULT __stdcall AddNamedItem(LPCOLESTR name, DWORD flags) override
HRESULT __stdcall GetScriptSite(REFIID riid, void **ppvObject) override
ULONG __stdcall AddRef() override
HRESULT __stdcall GetScriptState(SCRIPTSTATE *pss) override
static void registerFunctions(VM &vm)
int runScript(const std::string &source, VM *vm, const std::filesystem::path &path="", bool verbose=false)
Run a script.