Click here to Skip to main content
Licence CPOL
First Posted 24 Aug 2008
Views 12,868
Downloads 247
Bookmarked 20 times

JavaScript function access from plain C++: An example

By | 24 Aug 2008 | Article
How to execute JavaScript functions with parameters from C++ code.

Introduction

How can we execute JavaScript functions from C++, a question I asked a long time ago. But, recently, when I needed an interface between a C++ code and a JavaScript function within an HTML page, I decided to code in search of an answer to that question.

Using the code

For this solution, we have a file called "daveWare.html" located in the same directory/path as the *.exe of this program. The JavaScript function in this html page is:

.........

<script type="text/javascript">

function message(messagestring)
{
    alert(messagestring);

}

</script>

........

The solution, just one of many solutions, is to interface the HTML page/document using a COM/ATL interface, the IWebBrowser2 interface within the dWebCtrl class.

With this interface and its method "Navigate", we can navigate URLs and execute JavaScript (using javascript:) codes in the URLs, as follows:

///-///////////////////////////////////////////////////////////////////
///    Execute string "Script"
///-///////////////////////////////////////////////////////////////////
void dWebCtrl::ExecuteScript(char* Script)
{
    BSTR bstrScript;
    BSTR bufferScript;
    static DWORD size=0;
    char nameInput[256]={'\0'};

    memset(nameInput,'\0',sizeof(nameInput)-1);

    wsprintf(nameInput,"javascript:%s",Script);
    
    size = MultiByteToWideChar(CP_ACP, 0, nameInput, -1, 0, 0);
    if (!(bufferScript = 
         (wchar_t *)GlobalAlloc(GMEM_FIXED, sizeof(wchar_t)*size)))
        return;

    MultiByteToWideChar(CP_ACP, 0, nameInput, -1, bufferScript, size);
    bstrScript = SysAllocString(bufferScript);

    SysFreeString(bufferScript);

    pIwb->Navigate(bstrScript, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
    SysFreeString(bstrScript);

    return;
}

That's it. In our main process, we can access any JavaScript function and pass any parameter to it from our C++ code:

///-//////////////////////////////////////////////////////////////
///         Windows Procedure
///-//////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, 
                                  WPARAM wParam, LPARAM lParam)
{

    switch (message)
    /* handle the messages */
    {
        case WM_COMMAND:
            switch LOWORD(wParam)
            {
                case IDM_COMMAND_ALERT:
                    // execute the function "message" with parameter
                    // "David is the best" within the page "daveware.html" called 
                    // in our dWebCtrl
                    WebBrowser.ExecuteScript("javascript:message('David is the best');");
                    break;

                case IDM_FILE_EXIT:
                    SendMessage(hwnd,WM_DESTROY,(WPARAM)0,(LPARAM)0);
                    break;

            }

            break;

        case WM_CREATE:
        {
            GetCurrentDirectory(MAX_PATH-1,szDirectorioTrabajo);

            WebBrowser.Iniciar(hwnd,hInst);
            break;
        }

        case WM_SIZE:

            WebBrowser.OnResize(0,0);
            break;


        case WM_QUIT:
        case WM_DESTROY:
            /* send a WM_QUIT to the message queue */
            PostQuitMessage (0);
            break;


        default:   /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

Now, you can interface your C++ code with any JavaScript function located in any HTML page (you must know how the JavaScript function works, of course). My next step, access JavaScript "var" defined variables from C++. Any advice?

Best regards to all, and good luck with this stuff. My e-mail address. My URL.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

davemaster99

Software Developer
TeleTracking SAC
Peru Peru

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Questionwhich compilier to use? Pinmembermanojratnayake7:21 2 Feb '11  
GeneralGood job Pinmemberericpxz15:42 25 Aug '08  
GeneralRe: Good job Pinmemberdavemaster9917:36 25 Aug '08  
Generalspidermonkey Pinmembernorbert_barbosa0:38 26 Aug '08  
GeneralRe: spidermonkey Pinmemberdavemaster9923:21 1 Sep '08  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120517.1 | Last Updated 24 Aug 2008
Article Copyright 2008 by davemaster99
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid