分类: C/C++
2008-04-02 14:48:33

简介
问题描述class CSafeArrayHelper
{
public:
CSafeArrayHelper();
~CSafeArrayHelper();
bool Create(VARTYPE vt, UINT cDims, UINT lBound, UINT cCount);
bool Destroy();
UINT GetDimension();
bool Attach(LPSAFEARRAY psa);
bool AttachFromVariant(VARIANT* pVariant);
LPSAFEARRAY Detach();
LPSAFEARRAY GetArray();
bool AccessData(void FAR* FAR* pvData);
bool UnaccessData();
bool Lock();
bool Unlock();
bool PutElement(long lIndices, void FAR* vData);
bool GetElement(long lIndices, void FAR* vData);
VARIANT GetAsVariant();
protected:
LPSAFEARRAY m_pSA;
private:
}; 它提供和SAFEARRAY对象同样的功能,但是它对于我们某些人(比如我)来说,使用更简单。 当你想看你包装在你的SAFEARRAY中的数据类型的时候,函数GetAsVariant可能会很有用。由于SAFEARRAY的数据类型(fFeatures)不能处理所有的类型,所以此函数也不能读取所有的数据类型。也就是说,这个函数只是对数据类型的猜测。
如何使用
写一个脚本函数Function Celsius(fDegrees) Celsius = (fDegrees - 32) * 5 / 9 End Function用 JScript 写:
function Celsius(fDegres)
{
return (fDegres-32)*5/9;
}
要执行这个函数,只需要把每个变量存储到VARIANT里。由于你的函数(方法)可能包含不止一个参数,我们必须用一个SAFEARRAY来包装它。在后一种情况,你可能想通过检查String函数的.length属性或其他的方法来看数组传给函数的参数的数目。 function CountParam(aParam)
{
var strPresent = "Parameter is : " + (aParam.length>0 ? "Present": "Not present");
return strPresent;
}
同样的技术可以用在VBScript中,它允许你在运行时检测变长参数。调用无参数的函数,也要创建SAFEARRAY,只是没有参数。 调用一个脚本函数。你的代码应该和下边的实例一样简单:: void CScriptDemoDlg::OnBtnExecute()
{
CString strParam, strProc;
m_ctlParameter.GetWindowText( strParam );
m_ctlFunctions.GetWindowText( strProc );
CSafeArrayHelper sfHelper;
try{
_variant_t var;
if (strProc.IsEmpty())
sfHelper.Create(VT_VARIANT, 1, 0, 0); // (void) parameter
else
{
sfHelper.Create(VT_VARIANT, 1, 0, 1); // 1 parameter
var = _bstr_t(strParam);
}
sfHelper.PutElement(0, (void*)&var); // parameter1 -> index 0
LPSAFEARRAY sa = sfHelper.GetArray();
_variant_t varRet;
if (m_ScriptObj.RunProcedure(strProc, &sa, &varRet))
m_ctlResult.SetWindowText( (LPCTSTR)(_bstr_t(varRet)) );
else
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
}
catch(...)
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
}
一点建议function StartCalc()
{
var WshShell = new ActiveXObject("WScript.Shell");
var oExec = WshShell.Exec("calc");
WshShell = null;
}
var XML_Obj;
function StartModule()
{
XML_Obj = new ActiveXObject("Msxml.DOMDocument");
XML_Obj.async = false;
}
function StopModule()
{
XML_Obj = null;
}
function LoadSettings(strFilename)
{
XML_Obj.load(strFilename);
}
参考