如何在HTML JavaScript中调用MFC C++函数,以及如何在MFC C++中调用JavaScript函数?

5
我在互联网上搜索了一周都没有找到解决方案。我找到一个http://www.codeproject.com/Articles/2352/JavaScript-call-from-C。 但是这个解决方案非常难懂。
这个程序可以在线调用JavaScript,但我只想在内部调用JavaScript。例如,在项目中的test.htm文件中。只需一个简单的JavaScript函数和一个简单的C++函数。请帮忙。
根据我的项目要求,任何简单的函数都可以。例如,从JavaScript中添加或从C++中乘法等。

你为什么想要在MFC中使用Javascript或者反过来呢?这似乎是一个奇怪的需求。 - The Forest And The Trees
因为这是我的项目。 - Muhammad Raza
@MuhammadRaza,我认为这个问题是想问你的项目通过从C++调用Javascript API来实现什么功能? - utnapistim
2
要从C++调用javascript API,您需要在应用程序中嵌入(并启动)一个javascript引擎,类似于浏览器的做法。要从Javascript调用C++ API,您必须将其包装在内部javascript API中,并将其暴露给javascript运行时。这两个主题都非常广泛,您应该根据最终选择的javascript引擎来确定如何执行此操作。 - utnapistim
先生,我编辑了一些问题中的行。现在问题更清晰了。 - Muhammad Raza
1个回答

2
这是从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是你可以在.h文件中声明的CString变量。
OnInitDialog函数中,你可以给它赋任何值来在编辑框中显示,例如:

m_strMyEdit = _T("Enter anything");

如果你想在程序中稍后更新编辑框的值,只需添加以下几行代码:

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

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


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Muhammad Raza
我认为在JavaScript中调用C++是不可能的,但你可以在HTML元素的点击事件中调用C++函数,比如div、span、anchor等。 - Himanshu
我想在文本框中显示“嘿,我在这里”。 使用MyEdit在.cpp文件中。 - Muhammad Raza
是的,文件已包含。 - Muhammad Raza
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/79286/discussion-between-muhammad-raza-and-himanshu。 - Muhammad Raza
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接