如何在HTML JavaScript中调用mfc c++函数以及如何在mfc c++中调用JavaScript函数



我在网上定期搜索了1周没有答案。我找到了一个http://www.codeproject.com/Articles/2352/JavaScript-call-from-C。但是这个解很难理解。

这个程序可以在线调用JavaScript。我只想在内部调用JavaScript。例如项目中的test.htm。只有一个简单的JavaScript函数和一个简单的c++函数。请帮助。

根据我的项目任何简单的功能。例如从JavaScript中添加或从c++中乘法等

这是在MFC应用程序中调用javascript函数的方法
假设这是html文件中的一个javascript函数。 javascript函数

可能有不同类型的javascript函数
类型1:无参数,无返回值

function myfunction()
{
    Alert('Hey I am Here');
} 

类型2:参数没有返回值

function myfunction1(value)
{
    Alert(value);
} 

类型3:参数可以有也可以没有返回值

function myfunction2(value)
{
    return value;
}

这个函数用来调用javascript函数

BOOL CMyDlg::CallClientScript(LPCTSTR pStrFuncName, CStringArray* pArrFuncArgs, CComVariant* pOutVarRes)
{
BOOL bRes = FALSE;
CComVariant vaResult;
CComPtr<IHTMLDocument2> pIDoc2;
if(SUCCEEDED(this->GetDHtmlDocument(&pIDoc2)))  //Uses CDHtmlDialog as 'this'
{
    //Getting IDispatch for Java Script objects
    CComPtr<IDispatch> spScript;
    if(SUCCEEDED(pIDoc2->get_Script(&spScript)))
    {
        //Find dispid for given function in the object
        CComBSTR bstrMember(pStrFuncName);
        DISPID dispid = NULL;
        if(SUCCEEDED(spScript->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_USER_DEFAULT, &dispid)))
        {
            const int arraySize = pArrFuncArgs ? pArrFuncArgs->GetSize() : 0;
            //Putting parameters  
            DISPPARAMS dispparams;
            memset(&dispparams, 0, sizeof dispparams);
            dispparams.cArgs      = arraySize;
            dispparams.rgvarg     = new VARIANT[dispparams.cArgs];
            dispparams.cNamedArgs = 0;
            for( int i = 0; i < arraySize; i++)
            {
                CComBSTR bstr = pArrFuncArgs->GetAt(arraySize - 1 - i); // back reading
                bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
                dispparams.rgvarg[i].vt = VT_BSTR;
            }
            EXCEPINFO excepInfo;
            memset(&excepInfo, 0, sizeof excepInfo);
            UINT nArgErr = (UINT)-1;  // initialize to invalid arg
            //Call JavaScript function         
            if(SUCCEEDED(spScript->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr)))
            {
                //Done!
                bRes = TRUE;
            }
            //Free mem
            delete [] dispparams.rgvarg;
        }
    }
}
if(pOutVarRes)
    *pOutVarRes = vaResult;
return bRes;
}

如何使用?
点击任何按钮都可以调用这个函数,例如

onbuttonclickOk()
{
    CStringArray arrArgs;
    CComVariant varRes;
    //arrArgs.Add(_T("1"));//you can add value to CStringArray 
    //arrArgs.Add(_T("2"));//if your javascript function having any arguments
    CallClientScript(L"myfunction",&arrArgs,&varRes);
}

如何获得javaScript函数的返回值?
如果你的javascript函数返回任何值,它将被存储在varRes变量。
你可以得到像

这样的返回值
CString strTmp;
if(CallClientScript(L"myfunction3",&arrArgs,&varRes))
{
    if(varRes.vt == VT_BSTR){
        strTmp = varRes.bstrVal;// return value of javascript function.
    }
}
编辑:


使用编辑控件
假设您有一个这样的编辑控件

<input type="text" id="MyEdit" />  

在DoDataExchange中添加一行

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDHtmlDialog::DoDataExchange(pDX);
    DDX_DHtml_ElementInnerText(pDX, _T("MyEdit"), m_strMyEdit);// add this line
}

m_strMyEdit是一个CString变量,你可以在你的.h文件中声明。OnInitDialog,你可以给任何值显示在编辑控件,如:

m_strMyEdit = _T("Enter anything");

如果你想在以后的程序中更新编辑框值只需添加这些行

UpdateData();
m_strMyEdit =_T("Hello World");// give new value
UpdateData(FALSE);

如果你想访问编辑框值,你可以直接使用m_strMyEdit变量。
我想这会对你有帮助!!

相关内容

  • 没有找到相关文章

最新更新