2015-05-27 16 views
5

Cerco su internet 1 settimana regolarmente nessuna soluzione. Ho trovato uno http://www.codeproject.com/Articles/2352/JavaScript-call-from-C. Ma questa soluzione è molto difficile da capire.Come chiamare la funzione mfc C++ in JavaScript HTML e come chiamare la funzione JavaScript in mfc C++?

Questo programma può chiamare JavaScript ma online. Voglio solo chiamare JavaScript internamente. Ad esempio test.htm all'interno del progetto. Solo 1 semplice funzione di JavaScript e 1 semplice funzione di C++. Per favore aiuto.

Secondo il mio progetto qualsiasi funzione semplice. Ad esempio aggiungendo da JavaScript o moltiplicazione da C++ ecc.

+0

Perché esattamente si desidera utilizzare Javascript da MFC/vice versa? Sembra un requisito strano da avere. –

+0

Perché questo è il mio progetto. –

+0

@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

risposta

2

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à .. !!!

+0

Grazie himanshu questo codice è funzionante, ma se voglio chiamare una funzione C++ nello script java o in un'altra parola, chiama la funzione .ccp in .htm. Come faccio? –

+0

Non penso sia possibile chiamare 'C++' in 'Javas cript' ma puoi chiamare la funzione C++ al click di elementi HTML come, div, span, anchor ecc. – Himanshu

+0

Errore errore C3861: 'DDX_DHtml_ElementText': identificatore non trovato \t c: \ users \ administrator \ documents \ visual studio 2013 \ projects \ mfcapplication7 \ mfcapplication7 \ mfcapplication7dlg.cpp MFCApplication7 –