0

我有一个 Windows 本机 C++/Win32/MFC 对话框应用程序。我在对话框中使用 IE ActiveX 控件来呈现一些 HTML 内容。正在呈现的 HTML 包含一个按钮。该按钮有一个 onClick javascript 处理程序,如下所示。

<input type="button" id="uniqueButtonID" name="uniqueButtonName" value="blue" onClick="OnButtonClick('blue');">

当前,按钮单击由显示的 javascript 处理程序在页面中处理。这一切都有效。

相反,我想处理对话框 C++ 代码中的按钮单击。

我有一些处理对话框中其他事件的经验。例如,以下工作并允许处理文档完成事件和导航。

BEGIN_EVENTSINK_MAP(DMyDlg, CDialog)
ON_EVENT(DMyDlg, IDC_EXPLORER2, 259, DMyDlg::DocumentCompleteExplorer2, VTS_DISPATCH VTS_PVARIANT)
ON_EVENT(DMyDlg, IDC_EXPLORER2, 250, DMyDlg::BeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
END_EVENTSINK_MAP()

这些是预定义的众所周知的事件。不知道如何将其转化为处理我在 onClick="" 部分的按钮中定义的内容。

有人知道怎么做吗?这里的动机是我在另一个 C++ 应用程序中使用了一些代码,它定义了一些业务逻辑。我想要这里使用相同的业务逻辑。目前,我每次都必须将其翻译成 Javascript。如果我可以在 C++ 代码中处理事件,我可以复制/粘贴(或通过 DLL 重新使用)并避免 Javascript 翻译阶段。

4

1 回答 1

1

您需要创建一个 COM 对象作为 JavaScript 和 C++ 之间的桥梁。JavaScript 初始化代码将类似于:

var myhelper = new ActiveXObject("MyCompany.MyHelper");

请注意,尽管名称为“ActiveXObject”,但该对象不必是完整的 ActiveX 控件,只要是 COM 对象即可。然后在您的 onClick 处理程序中,您可以执行以下操作:

myhelper.DoThis();
myhelper.DoThat();

“有趣”的部分是在 C++ 中创建 COM 对象——IDL 文件、ATL 类、IDispatch、IUnknown 以及所有我想忘记的东西。

不过有一件事 - 如果 C++ 代码存在于您的应用程序 exe 中(而不是在单独的 COM DLL 中),请不要忘记,当您的程序启动时,您必须为“MyCompany.MyHelper”创建一个类工厂实例并将其注册到COM 以便 JavaScript 中的“新 ActiveXObject”成功。

[更新1]

我应该在最初的回复中添加 - 如果可以避免,我实际上不建议这样做。早在 C# 和 .NET 出现之前,我们公司实际上虽然 COM 是个好东西,而且值得花时间和精力去学习它。今天……没那么多。

In your case, having your business logic in C++ and again in JavaScript might seem like a lot of extra work - but at least it is extra work that you can plan, allocate resources to and have a hope of being able to finish. Once you go down the path of C++/COM/ActiveScripting, when stuff stops working - there is no limit to the amount of time you might spend trying to chase down obscure COM related issues. Anyhow good luck!

于 2012-09-17T16:40:56.617 回答