0

WindowsネイティブのC++/ Win32/MFCダイアログアプリがあります。ダイアログでIEActiveXコントロールを使用して、HTMLコンテンツをレンダリングしています。レンダリングされるHTMLにはボタンが含まれています。以下に示すように、ボタンにはonClickjavascriptハンドラーがあります。

<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

JavaScript と C++ の間のブリッジとして COM オブジェクトを作成する必要があります。JavaScript の初期化コードは次のようになります。

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

「ActiveXObject」という名前にもかかわらず、オブジェクトは完全な ActiveX コントロールである必要はなく、単なる COM オブジェクトであることに注意してください。次に、 onClick ハンドラーで次のことができます。

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

「楽しい」部分は、C++ で COM オブジェクトを作成することです。IDL ファイル、ATL クラス、IDispatch、IUnknown など、私が忘れようとしているすべてのものです。

ただし、C++ コードが (別の COM DLL ではなく) アプリケーションの exe に存在する場合は、プログラムの起動時に「MyCompany.MyHelper」のクラス ファクトリ インスタンスを作成し、それを登録する必要があることを忘れないでください。 COM を使用して、JavaScript の「新しい ActiveXObject」が成功するようにします。

【アップデート1】

最初の応答に追加する必要がありました-回避できる場合、これを行うことは実際にはお勧めしません。C# と .NET が存在する前は、COM は良いものであり、時間と労力をかけて学ぶ価値があると考えていました。今日は…あんまり。

あなたのケースでは、ビジネス ロジックを C++ で作成し、再び JavaScript で作成することは、多くの余分な作業のように思えるかもしれません。C++/COM/ActiveScripting のパスをたどると、何かが機能しなくなったときに、あいまいな COM 関連の問題を追跡するのに費やす時間に制限はありません。とにかく頑張ってください!

于 2012-09-17T16:40:56.617 に答える