65.9K
CodeProject 正在变化。 阅读更多。
Home

从纯 C++ 访问 JavaScript 函数:一个例子

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.28/5 (9投票s)

2008 年 8 月 24 日

CPOL

1分钟阅读

viewsIcon

47651

downloadIcon

1098

如何从 C++ 代码执行带有参数的 JavaScript 函数。

引言

很久以前我就问过,如何从 C++ 执行 JavaScript 函数。但是,最近,当我需要在 HTML 页面内,C++ 代码和 JavaScript 函数之间建立接口时,我决定通过编写代码来寻找答案。

使用代码

对于这个解决方案,我们有一个名为“daveWare.html”的文件,它位于与该程序的 *.exe 文件相同的目录/路径中。此 html 页面中的 JavaScript 函数是

.........

<script type="text/javascript">

function message(messagestring)
{
    alert(messagestring);

}

</script>

........

该解决方案,只是众多解决方案中的一个,是使用 COM/ATL 接口,即 dWebCtrl 类中的 IWebBrowser2 接口来接口 HTML 页面/文档。

通过这个接口及其“Navigate”方法,我们可以导航 URL 并执行 URL 中的 JavaScript (使用 javascript:) 代码,如下所示

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

就是这样。在我们的主进程中,我们可以从我们的 C++ 代码访问任何 JavaScript 函数,并传递任何参数给它

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

现在,你可以将你的 C++ 代码与位于任何 HTML 页面中的任何 JavaScript 函数接口(当然,你必须知道 JavaScript 函数是如何工作的)。我的下一步,是从 C++ 访问 JavaScript “var” 定义的变量。有什么建议吗?

祝大家一切顺利,并祝你好运。 我的电子邮件地址我的网址

© . All rights reserved.