如何在HTMLJavaScript中调用mfc C++函数,如何在mfc C++中调用JavaScript函数?
How to call mfc C++ function in HTML JavaScript and how to call JavaScript Function in mfc C++?
我定期在互联网上搜索 1 周没有解决方案。我找到了一个 http://www.codeproject.com/Articles/2352/JavaScript-call-from-C。
但是这个解决方案很难理解。
此程序可以调用 JavaScript 但在线。我只想在内部调用 JavaScript。例如项目中的 test.htm。只有 JavaScript 的 1 个简单函数和 c++ 的 1 个简单函数。请帮助。
根据我的项目任何简单的功能。例如从 JavaScript 添加或从 c++ 等乘法
这是从 MFC 应用程序调用 javascript 函数的方法
假设这是 html 文件中的一个 javascript 函数。
JAVSCRIPT 函数
可能有不同类型的javascript函数
类型 1: 无参数,无 return 值
function myfunction()
{
Alert('Hey I am Here');
}
类型 2: 有没有 return 值的参数
function myfunction1(value)
{
Alert(value);
}
类型 3: 参数可能有也可能没有 return 值
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函数的return值?
如果您的 javascript 函数是 returning 任何值,它将存储在 varRes
变量中。
你可以获得 return 值,例如
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
变量。
我认为这会对您有所帮助..!!!
我定期在互联网上搜索 1 周没有解决方案。我找到了一个 http://www.codeproject.com/Articles/2352/JavaScript-call-from-C。 但是这个解决方案很难理解。
此程序可以调用 JavaScript 但在线。我只想在内部调用 JavaScript。例如项目中的 test.htm。只有 JavaScript 的 1 个简单函数和 c++ 的 1 个简单函数。请帮助。
根据我的项目任何简单的功能。例如从 JavaScript 添加或从 c++ 等乘法
这是从 MFC 应用程序调用 javascript 函数的方法
假设这是 html 文件中的一个 javascript 函数。
JAVSCRIPT 函数
可能有不同类型的javascript函数
类型 1: 无参数,无 return 值
function myfunction()
{
Alert('Hey I am Here');
}
类型 2: 有没有 return 值的参数
function myfunction1(value)
{
Alert(value);
}
类型 3: 参数可能有也可能没有 return 值
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函数的return值?
如果您的 javascript 函数是 returning 任何值,它将存储在 varRes
变量中。
你可以获得 return 值,例如
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
变量。
我认为这会对您有所帮助..!!!