如何在 HTML JavaScript 中调用 mfc C++ 函数以及如何在 mfc C++ 中调用 JavaScript 函数? [关闭]

Posted

技术标签:

【中文标题】如何在 HTML JavaScript 中调用 mfc C++ 函数以及如何在 mfc C++ 中调用 JavaScript 函数? [关闭]【英文标题】:How to call mfc C++ function in HTML JavaScript and how to call JavaScript Function in mfc C++? [closed] 【发布时间】:2015-05-27 08:14:46 【问题描述】:

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

这个程序可以调用 JavaScript,但是是在线的。我只想在内部调用 JavaScript。比如项目里面的test.htm。只需 1 个简单的 JavaScript 函数和 1 个简单的 c++ 函数。请帮忙。

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

【问题讨论】:

您究竟为什么要使用 MFC 中的 Javascript/反之亦然?这似乎是一个奇怪的要求。 因为这是我的项目。 @MuhammadRaza,我认为这个问题的意思是“你的项目试图通过从 C++ 调用 Javascript API 来做什么(功能是什么?) 要从 C++ 调用 javascript API,您需要在应用程序中嵌入(并启动)javascript engine,类似于浏览器所做的。要从 Javascript 调用 C++ API,您必须将其包装在内部 javascript API 中并将其公开给 javascript 运行时。两者都是非常广泛的主题,您执行此操作的方式应取决于您最终选择的 javascript 引擎。 先生,我在我的问题中编辑了一些行。现在问题更清楚了。 【参考方案1】:

这是从 MFC 应用程序调用 javascript 函数的方式 假设这是您的 html 文件中的 javascript 函数。JAVSCRIPT 函数

可能有不同类型的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变量。 我想这会对你有所帮助..!!!

【讨论】:

谢谢 himanshu 这个代码是有效的。但是,如果我想在 java 脚本或另一个词中调用 c++ 函数。在 .htm 中调用 .ccp 函数。我是怎么做到的? 错误 12 错误 C3861: 'DDX_DHtml_ElementText': 找不到标识符 c:\users\administrator\documents\visual studio 2013\projects\mfcapplication7\mfcapplication7\mfcapplication7dlg.cpp 45 1 MFCApplication7 我正在使用 html 对话框。 签入stdafx.h文件,你添加#include &lt;afxdhtml.h&gt;了吗?

以上是关于如何在 HTML JavaScript 中调用 mfc C++ 函数以及如何在 mfc C++ 中调用 JavaScript 函数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 HTML 中调用 JavaScript 函数而不是 href

如何在html代码里面调用javascript变量?

如何在html网页中调用JS函数

在 QT 中,如何将带有内部调用的 javascript 的 html 转换为 pdf 文件

我们如何在 vuejs 的 javascript 文件中定义的 vuejs 的 html 文件中调用函数而不在 html 文件中创建按钮?

如何在javascript fetch中存储访问令牌并传递给下一个api调用