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






4.28/5 (9投票s)
如何从 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
” 定义的变量。有什么建议吗?