Questo è il modo per chiamare la funzione javascript dall'applicazione MFC
Supponiamo che questa sia una funzione javascript nel file html.
javscript funzione
Ci possono essere vari tipi di funzione javascript
Tipo 1: Nessun argomento, nessun valore di ritorno
function myfunction()
{
Alert('Hey I am Here');
}
Tipo 2: hanno Argomenti senza ritorno Valore
function myfunction1(value)
{
Alert(value);
}
Tipo 3: argomenti possono o non possono avere con valore di ritorno
function myfunction2(value)
{
return value;
}
Questa funzione viene utilizzata per chiamare funzione 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;
}
Come usare?
Su clic di un pulsante qualsiasi si può chiamare questa funzione, ad esempio
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);
}
Come ottenere valore di ritorno della funzione JavaScript?
Se la funzione javascript restituisce alcun valore, verrà memorizzata nella variabile varRes
.
è possibile ottenere il valore di ritorno come
CString strTmp;
if(CallClientScript(L"myfunction3",&arrArgs,&varRes))
{
if(varRes.vt == VT_BSTR){
strTmp = varRes.bstrVal;// return value of javascript function.
}
}
EDIT:
Lavora con controllo di modifica
supponiamo di avere un controllo di modifica del genere
<input type="text" id="MyEdit" />
In DoDataExchange aggiungere una riga
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDHtmlDialog::DoDataExchange(pDX);
DDX_DHtml_ElementInnerText(pDX, _T("MyEdit"), m_strMyEdit);// add this line
}
m_strMyEdit
è una variabile CString
che è possibile dichiarare nel file .h
.
OnInitDialog, si può dare alcun valore per mostrare nel controllo di modifica, come:
m_strMyEdit = _T("Enter anything");
E se si desidera aggiornare il valore editbox più avanti nel programma è sufficiente aggiungere queste righe
UpdateData();
m_strMyEdit =_T("Hello World");// give new value
UpdateData(FALSE);
se si desidera per accedere al valore di editbox è possibile utilizzare direttamente la variabile m_strMyEdit
.
Penso che questo ti aiuterà .. !!!
Perché esattamente si desidera utilizzare Javascript da MFC/vice versa? Sembra un requisito strano da avere. –
Perché questo è il mio progetto. –
@MuhammadRaza, penso che la domanda volesse dire "che cosa sta cercando di fare il tuo progetto chiamando le API Javascript da C++ (qual è la funzionalità?) – utnapistim