374 lines
9.5 KiB
C++
374 lines
9.5 KiB
C++
/*++
|
|
|
|
Copyright (C) 1999-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ADDRESLV.H
|
|
|
|
Abstract:
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
//***************************************************************************
|
|
//
|
|
// test.cpp
|
|
//
|
|
// Module: test.exe
|
|
//
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <initguid.h>
|
|
#include "script.h"
|
|
#include <activscp.h>
|
|
#include <string.h>
|
|
#include <io.h>
|
|
#include <fcntl.h>
|
|
#include <sys/stat.h>
|
|
|
|
#define LOCATOR L"Locator"
|
|
|
|
|
|
class CScriptSite : public IActiveScriptSite, public IActiveScriptSiteWindow
|
|
{
|
|
protected:
|
|
long m_lRef;
|
|
HWND m_hWnd;
|
|
IDispatch* m_pObject;
|
|
// CScriptSink* m_pSink;
|
|
public:
|
|
CScriptSite(HWND hWnd, IDispatch * pObject);
|
|
~CScriptSite();
|
|
|
|
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv);
|
|
ULONG STDMETHODCALLTYPE AddRef();
|
|
ULONG STDMETHODCALLTYPE Release();
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE GetLCID(
|
|
/* [out] */ LCID __RPC_FAR *plcid);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE GetItemInfo(
|
|
/* [in] */ LPCOLESTR pstrName,
|
|
/* [in] */ DWORD dwReturnMask,
|
|
/* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppiunkItem,
|
|
/* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppti);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE GetDocVersionString(
|
|
/* [out] */ BSTR __RPC_FAR *pbstrVersion);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE OnScriptTerminate(
|
|
/* [in] */ const VARIANT __RPC_FAR *pvarResult,
|
|
/* [in] */ const EXCEPINFO __RPC_FAR *pexcepinfo);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE OnStateChange(
|
|
/* [in] */ SCRIPTSTATE ssScriptState);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE OnScriptError(
|
|
/* [in] */ IActiveScriptError __RPC_FAR *pscripterror);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE OnEnterScript( void);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE OnLeaveScript( void);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE GetWindow(
|
|
/* [out] */ HWND __RPC_FAR *phwnd);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE EnableModeless(
|
|
/* [in] */ BOOL fEnable);
|
|
|
|
};
|
|
|
|
CScriptSite::CScriptSite(HWND hWnd, IDispatch * pObject)
|
|
{
|
|
m_hWnd = hWnd;
|
|
m_lRef = 0;
|
|
m_pObject = pObject;
|
|
pObject->AddRef();
|
|
}
|
|
|
|
CScriptSite::~CScriptSite()
|
|
{
|
|
m_pObject->Release();
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::QueryInterface(REFIID riid, void** ppv)
|
|
{
|
|
if(riid == IID_IUnknown || riid == IID_IActiveScriptSite)
|
|
*ppv = (IActiveScriptSite*)this;
|
|
else if(riid == IID_IActiveScriptSiteWindow)
|
|
*ppv = (IActiveScriptSiteWindow*)this;
|
|
else
|
|
return E_NOINTERFACE;
|
|
((IUnknown*)*ppv)->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE CScriptSite::AddRef()
|
|
{
|
|
return InterlockedIncrement(&m_lRef);
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE CScriptSite::Release()
|
|
{
|
|
long lRef = InterlockedDecrement(&m_lRef);
|
|
if(lRef == 0)
|
|
delete this;
|
|
return lRef;
|
|
}
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::GetLCID(
|
|
/* [out] */ LCID __RPC_FAR *plcid)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::GetItemInfo(
|
|
/* [in] */ LPCOLESTR pstrName,
|
|
/* [in] */ DWORD dwReturnMask,
|
|
/* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppiunkItem,
|
|
/* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppti)
|
|
{
|
|
if(_wcsicmp(pstrName, LOCATOR))
|
|
return TYPE_E_ELEMENTNOTFOUND;
|
|
if(ppti)
|
|
*ppti = NULL;
|
|
if(ppiunkItem)
|
|
*ppiunkItem = NULL;
|
|
|
|
if(dwReturnMask & SCRIPTINFO_IUNKNOWN)
|
|
{
|
|
if(ppiunkItem == NULL)
|
|
return E_POINTER;
|
|
m_pObject->QueryInterface(IID_IUnknown, (void**)ppiunkItem);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::GetDocVersionString(
|
|
/* [out] */ BSTR __RPC_FAR *pbstrVersion)
|
|
{ return E_NOTIMPL;}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::OnScriptTerminate(
|
|
/* [in] */ const VARIANT __RPC_FAR *pvarResult,
|
|
/* [in] */ const EXCEPINFO __RPC_FAR *pexcepinfo)
|
|
{ return S_OK;}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::OnStateChange(
|
|
/* [in] */ SCRIPTSTATE ssScriptState)
|
|
{ return S_OK;}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::OnScriptError(
|
|
/* [in] */ IActiveScriptError __RPC_FAR *pscripterror)
|
|
{
|
|
HRESULT hres;
|
|
EXCEPINFO ei;
|
|
hres = pscripterror->GetExceptionInfo(&ei);
|
|
if(SUCCEEDED(hres))
|
|
{
|
|
|
|
printf("\nGot Error from source %S", ei.bstrSource);
|
|
printf("\nDescription is %S", ei.bstrDescription);
|
|
printf("\nThe error code is 0x%x", ei.scode);
|
|
DWORD dwLine, dwCookie;
|
|
long lChar;
|
|
pscripterror->GetSourcePosition(&dwCookie, &dwLine, &lChar);
|
|
printf("\nError occured on line %d, character %d", dwLine, lChar);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::OnEnterScript( void)
|
|
{ return S_OK;}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::OnLeaveScript( void)
|
|
{ return S_OK;}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::GetWindow(
|
|
/* [out] */ HWND __RPC_FAR *phwnd)
|
|
{
|
|
*phwnd = NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CScriptSite::EnableModeless(
|
|
/* [in] */ BOOL fEnable)
|
|
{return S_OK;}
|
|
|
|
LPWSTR pScriptText = L"MsgBox(\"hello\")\n"
|
|
L"dim services\n"
|
|
L"dim class\n"
|
|
L"dim property\n"
|
|
L"dim vartype\n"
|
|
L"Text = \"root\"\n"
|
|
L"Set services = nothing\n"
|
|
L"Set Class = nothing\n"
|
|
L"Locator.ConnectServer Text, \"\" , \"\", \"\", 0, VT_Null, nothing, services\n"
|
|
L"services.GetObject \"__win32provider\", 0, nothing, Class, nothing\n"
|
|
L"class.Get \"__Class\",0, property, vartype, 0\n"
|
|
L"MsgBox(vartype)";
|
|
|
|
|
|
WCHAR * ReadFile(char * pFileName)
|
|
{
|
|
FILE *fp;
|
|
BOOL bUnicode = FALSE;
|
|
BOOL bBigEndian = FALSE;
|
|
|
|
// Make sure the file exists and can be opened
|
|
|
|
fp = fopen(pFileName, "rb");
|
|
if (!fp)
|
|
{
|
|
printf("\nCant open file %s", pFileName);
|
|
return NULL;
|
|
}
|
|
|
|
// Determine the size of the file
|
|
// ==============================
|
|
|
|
fseek(fp, 0, SEEK_END);
|
|
long lSize = ftell(fp) + 4; // add a bit extra for ending space and null NULL
|
|
fseek(fp, 0, SEEK_SET);
|
|
|
|
// Check for UNICODE source file.
|
|
// ==============================
|
|
|
|
BYTE UnicodeSignature[2];
|
|
if (fread(UnicodeSignature, sizeof(BYTE), 2, fp) != 2)
|
|
{
|
|
printf("\nNothing in file %s", pFileName);
|
|
fclose(fp);
|
|
return NULL;
|
|
}
|
|
|
|
if (UnicodeSignature[0] == 0xFF && UnicodeSignature[1] == 0xFE)
|
|
{
|
|
LPWSTR pRet = new WCHAR[lSize/2 +2];
|
|
if(pRet == NULL)
|
|
return NULL;
|
|
fread(pRet, 1, lSize-2, fp);
|
|
fclose(fp);
|
|
return pRet;
|
|
}
|
|
|
|
else
|
|
{
|
|
fseek(fp, 0, SEEK_SET);
|
|
LPSTR pTemp = new char[lSize+1];
|
|
LPWSTR pRet = new WCHAR[lSize+1];
|
|
if(pRet == NULL || pTemp == NULL)
|
|
return NULL;
|
|
fread(pTemp, 1, lSize, fp);
|
|
fclose(fp);
|
|
mbstowcs(pRet, pTemp, lSize);
|
|
delete pTemp;
|
|
return pRet;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
// main
|
|
//
|
|
// Purpose: Initialized Ole, calls some test code, cleans up and exits.
|
|
//
|
|
//***************************************************************************
|
|
|
|
int main(int iArgCnt, char ** argv)
|
|
{
|
|
|
|
if(iArgCnt != 2)
|
|
{
|
|
printf("\nUsage c:\\conscript scriptfile");
|
|
return 1;
|
|
}
|
|
|
|
LPWSTR pScriptText = ReadFile(argv[1]);
|
|
if(pScriptText == NULL)
|
|
return 1;
|
|
|
|
HRESULT sc = CoInitialize(0);
|
|
|
|
CLSID clsid;
|
|
|
|
// Get the DIWbemLocator
|
|
|
|
IDispatch * pLocator = NULL;
|
|
|
|
sc = CLSIDFromString(L"{CB7CA032-F729-11D0-9E4D-00C04FC324A8}", &clsid);
|
|
sc = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void **)&pLocator);
|
|
if(FAILED(sc))
|
|
return 1;
|
|
|
|
// Get the scripting engine
|
|
|
|
sc = CLSIDFromString(L"{B54F3741-5B07-11cf-A4B0-00AA004A55E8}", &clsid);
|
|
|
|
IClassFactory * pFactory = NULL;
|
|
sc = CoGetClassObject(clsid, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
|
|
NULL, IID_IClassFactory, (void**)&pFactory);
|
|
if(FAILED(sc))
|
|
return 1;
|
|
|
|
IActiveScript* pScript;
|
|
sc = pFactory->CreateInstance(NULL, IID_IActiveScript,
|
|
(void**)&pScript);
|
|
if(FAILED(sc))
|
|
return 1;
|
|
|
|
IActiveScriptParse* pParse;
|
|
sc = pScript->QueryInterface(IID_IActiveScriptParse, (void**)&pParse);
|
|
if(FAILED(sc))
|
|
return 1;
|
|
|
|
sc = pParse->InitNew();
|
|
|
|
// Create the scripting site
|
|
|
|
CScriptSite* pSite = new CScriptSite(NULL, pLocator);
|
|
pSite->AddRef();
|
|
pLocator->Release();
|
|
sc = pScript->SetScriptSite(pSite);
|
|
pSite->Release();
|
|
|
|
sc = pScript->AddNamedItem(LOCATOR,
|
|
SCRIPTITEM_ISVISIBLE | SCRIPTITEM_NOCODE);
|
|
if(FAILED(sc))
|
|
return 1;
|
|
|
|
|
|
EXCEPINFO ei;
|
|
sc = pParse->ParseScriptText(
|
|
pScriptText,
|
|
NULL, NULL, NULL,
|
|
0, 0, 0, NULL, &ei);
|
|
if(FAILED(sc))
|
|
return 1;
|
|
|
|
pParse->Release();
|
|
|
|
sc = pScript->SetScriptState(SCRIPTSTATE_CONNECTED);
|
|
if(FAILED(sc))
|
|
return 1;
|
|
|
|
pScript->Release();
|
|
|
|
CoUninitialize();
|
|
printf("Terminating normally\n");
|
|
return 0;
|
|
}
|
|
|