2015-05-27 34 views
5

Szukam w Internecie 1 tydzień regularnie nie ma rozwiązania. Znalazłem jeden http://www.codeproject.com/Articles/2352/JavaScript-call-from-C. Ale to rozwiązanie jest bardzo trudne do zrozumienia.Jak wywołać funkcję C++ w kodzie HTML JavaScript i jak wywołać funkcję JavaScript w programie mfc C++?

Ten program może wywoływać JavaScript, ale online. Chcę tylko wywołać JavaScript wewnętrznie. Na przykład test.htm w projekcie. Tylko 1 prosta funkcja JavaScript i 1 prosta funkcja C++. Proszę pomóż.

Według mojego projektu każda prosta funkcja. Na przykład dodanie z JavaScript lub mnożenie z C++ itd.

+0

Dlaczego dokładnie chcesz używać JavaScript z MFC/odwrotnie? Wydaje się to dziwnym wymaganiem. –

+0

Bo to jest mój projekt. –

+0

@MuhammadRaza, myślę, że pytanie oznaczało "jaki jest twój projekt próbujący zrobić, wywołując JavaScript API z C++ (jaka jest funkcjonalność?) – utnapistim

Odpowiedz

2

To jest sposób wywołania funkcji javascript z aplikacji MFC
Załóżmy, że jest to funkcja javascript w pliku html.
javscript funkcja

Nie może być inny rodzaj funkcji javascript
Typ 1: żadne argumenty, nie zwraca wartości

function myfunction() 
{ 
    Alert('Hey I am Here'); 
} 

Typ 2: posiadające argumenty nie zwraca wartości

function myfunction1(value) 
{ 
    Alert(value); 
} 

Typ 3: Argumenty mogą lub nie mogą mieć z wartości zwracanej

function myfunction2(value) 
{ 
    return value; 
} 

Ta funkcja służy do wywołać javascript funkcja

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; 
} 

Jak korzystać?
Po kliknięciu dowolnego przycisku można wywołać tę funkcję, na przykład

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); 
} 

Jak uzyskać wartość zwracana funkcji JavaScript?
Jeśli funkcja javascript zwraca jakąkolwiek wartość, będzie przechowywana w zmiennej varRes.
można uzyskać wartości zwracanej jak

CString strTmp; 
if(CallClientScript(L"myfunction3",&arrArgs,&varRes)) 
{ 
    if(varRes.vt == VT_BSTR){ 
     strTmp = varRes.bstrVal;// return value of javascript function. 
    } 
} 

EDIT:
Pracuj z edycji kontroli
przypuszczać masz kontrolę edycji podobny do tego

<input type="text" id="MyEdit" /> 

W DoDataExchange dodać jedną linię

void CMyDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDHtmlDialog::DoDataExchange(pDX); 
    DDX_DHtml_ElementInnerText(pDX, _T("MyEdit"), m_strMyEdit);// add this line 
} 

m_strMyEdit to zmienna CString, którą można zadeklarować w pliku .h.
OnInitDialog można nadać dowolną wartość, aby pokazać w edycji kontroli, takich jak:

m_strMyEdit = _T("Enter anything"); 

A jeśli chcesz zaktualizować wartość polu edycji później w programie wystarczy dodać te linie

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

jeśli chcesz aby uzyskać dostęp do wartości pola edycyjnego, możesz bezpośrednio użyć zmiennej m_strMyEdit.
Myślę, że to ci pomoże .. !!!

+0

Dziękuję himanshu ten kod działa, ale jeśli chcę wywołać funkcję C++ w skrypcie java lub innym słowie, wywołaj funkcję .ccp w .htm Jak to zrobić? –

+0

Nie sądzę, że można wywołać 'C++' w 'JavaS cript' ale możesz wywołać funkcję C++ po kliknięciu elementów HTML takich jak, div, span, anchor .. itd. – Himanshu

+0

Błąd błąd C3861: 'DDX_DHtml_ElementText': nie znaleziono identyfikatora \t c: \ users \ administrator \ documents \ visual studio 2013 \ projects \ mfcapplication7 \ mfcapplication7 \ mfcapplication7dlg.cpp MFCApplication7 –