問題タブ [iwebbrowser2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - IWebBrowser2インターフェースの依存関係グラフ
IWebBrowser2コンポーネントのインターフェース依存関係グラフはありますか?インターフェイス間にどのような依存関係が存在し、誰が誰を呼び出すのかを明確にしたいだけです。
windows - IWebBrowser2 とマルチスレッド アパートメント?
WebBrowser コントロール ( IWebBrowser2) が埋め込まれた Windows アプリを開発しています。
COM アパートメントをシングル スレッドとして初期化すると、うまくいきます。
ただし、マルチスレッドに変更すると、次のようになります。
その後、次の戻り値ですべての場所で失敗し始めます。
アプリケーションが入力同期呼び出しをディスパッチしているため、発信呼び出しを行うことができません。
IWebBrowser2 メソッドへの呼び出しから。
誰かが問題を解決する方法を教えてもらえますか? 要件としてマルチスレッド アパートメントを使用する必要があります。助けてください!
javascript - Webブラウザコントロールで実行されているJavaScriptスクリプトからC++関数を呼び出す
c++アプリケーションにWebブラウザコントロールを埋め込みました。Webブラウザコントロールで実行されているJavaScriptでc++関数/メソッドを呼び出せるようにしたい。
私はこれを行うための3つの方法についての言及を見つけました:
- 仲介者として機能するActiveXコンポーネントを実装します。(実装の詳細はこちら: http: //blogs.msdn.com/b/nicd/archive/2007/04/18/calling-into-your-bho-from-a-client-script.aspx)
- window.externalを使用します。(上記のリンクでも説明されていますが、実装は提供されていません)
- ウィンドウオブジェクトにカスタムオブジェクトを追加します
3番目のオプションを使用したいのですが、その方法に関する実用的な例は見つかりませんでした。誰かがそれを行う方法を教えてくれますか、またはどこかのネット上の実用的な例にリンクしてください。
私が見つけた例に最も近いのは、webbrowser_ctlニュースグループのスレッドでのIgorTandetnikによる最初の返信です。しかし、私はそれ以上の助けが必要だと思います。
IWebBrowser2コントロールを埋め込み、MFC、ATL、またはWTLを使用していません。
編集:
以前にリンクしたスレッドでIgorによって提供された擬似コードと、codeprojectの記事「C++からのJavaScript配列およびその他のオブジェクトの作成」にあるコードを使用して、いくつかのコードを作成しました。
上記のコードは最後まで実行されるため、これまでのところすべてが正常に見えます。
DISPID_NAVIGATECOMPLETE2 DWebBrowserEvents2イベントを受け取ったときにAddCustomObjectを呼び出し、これを次のように渡します*custObj。
注目すべき実装は
と
残念ながら、JavaScriptコードから「JSObject」オブジェクトを使用しようとすると、「Invoke」メッセージボックスが表示されません。
編集2:
GetIDsOfNames私はそのように実装しました:
これが私のコンストラクターです
プライベートクラスメンバーとして定義されたDISPID_USER_*定数を使用
編集3、4、5:
別の質問に移動しました
編集6:
「文字列を返す」編集から別の質問をしました。そうすれば、元の質問に答えるGeorgの返信を受け入れることができます。
編集7:
完全に機能する、自己完結型の実装例について、いくつかのリクエストがありました。https://github.com/Tobbe/CppIEEmbedです。できればフォークして改善してください:)
javascript - C++関数からJavaScriptに文字列を返す
IDispatchインターフェイスを実装するクラス(JSObject)があります。このクラスは、ホストされているWebブラウザーコントロール(IWebBrowser2)で実行されているJavaScriptに公開されています。
これがどのように機能するかについては、こちらをご覧ください:Webブラウザコントロールで実行されているJavaScriptスクリプトからC++関数を呼び出す
JavaScriptコードからJSObjectを呼び出すことができ、返された整数/長さを受け取ることができます。しかし、関数が文字列(BSTR)を返すと、問題が発生します。
これはIDispatch::Invoke()コードの一部です:
上記のコードを使用するalert()と、返された文字列を使用できますが、追加することはできません。alert(returnedString + "foo");「返された文字列」のみが表示されます。「foo」の部分は文字列に追加されません。どういうわけか文字列の終わりに何か問題があるようです。誰かアイデアはありますか?
また、電話をかけていないので、ここでメモリリークが発生していSysFreeString()ますか?
編集:
を使用できるように、一時的にatlbase.hを含めましたCComBSTR。上記のコードは次のようになります。
そのコードをステップスルーすると、関数が戻るまで、pVarResultが「テスト文字列」であることが確実にわかります。しかし、JavaScriptコードで返された文字列をalert()すると、「展開」されます。alert(returnedString + "foo")「expandedfoo」です。したがって、返された文字列に追加できるので、正しい方向への小さなステップです。しかし、返された文字列は私が実際に返したものではないため、これは間違った方向への一歩でもあります...
そのコードは、前のリストのコードと同じ結果をもたらします(CComBSTRを使用)。
internet-explorer - CoCreateInstance を使用して Internet Explorer の整合性の低いインスタンスを作成するにはどうすればよいですか?
標準の昇格されていない中程度の整合性プロセスから、Windows Vista で Internet Explorer 7 のインスタンスを作成する必要があり、そのために CoCreateInstance を使用する必要があります。このスレッドで概説されているような手法を使用してみましたが、いくつかの課題がありました。スレッドの整合性レベルを下げ、CoCreateInstance を使用して IE インスタンスを起動することはできますが、インスタンスは中程度の整合性レベルのままです。CLSCTX_ENABLE_CLOAKING を CoCreateInstance に指定すると、失敗した HRESULT (0x80080005) が返されます。私は何が欠けていますか?これの最初から最後までの作業例を知っている人はいますか?
c++ - IWebBrowser2 は、ユーザーが指定したフォルダーに Cookie を保存できますか?
私は IWebBrowser2 を使用して c++ の小さな Web ブラウザーで作業しています。問題は、ブラウザーで Cookie を削除すると、IE で Cookie が削除され、IE Cookie に干渉したくないことです。これを解決する方法はありますか?
internet-explorer - IWebBrowser2 と IE の Cookie
IWebBrowser2 を使用して Web ページを表示していますが、通常の IE と同じ Cookie を表示できないようです。
たとえば、IE で Facebook にログインして [Remember Me] をオンにすると、次に IE を開いて Facebook にアクセスしても、ログインしたままになります。
ただし、IWebBrowser2 を使用して Facebook にアクセスすると、ログインできなくなります。
IWebBrowser2 と IE は 2 つの異なる Cookie セットを使用しているように思えますか? もしそうなら、IWebBrowser2 が IE と同じ Cookie を認識できるようにするにはどうすればよいですか?
どうもありがとうございました。
c++ - DWebBrowserEvents2 イベントをシンクすると、プログラムによるナビゲーションがハングするように見える
この質問は MSDN フォーラムに投稿しましたが、私の経験では Stack Overflow での回答の質が向上しているため、ここにも投稿します。以前に何度か投稿したように、私はブラウザー自動化フレームワークに取り組んでおり、外部プロセスから Internet Explorer を自動化しています。私のアーキテクチャは次のとおりです。自動化クライアントがコマンドをプッシュする名前付きパイプを開くサーバーがあります。サーバーはコマンドを解釈し、独自の C++ クラスにラップした IWebBrowser2 オブジェクトで実行します。IE インスタンスでイベントをシンクしようとするまで、すべて正常に動作します。私のラッパー クラスは IDispEventSimpleImpl を実装していますが、イベントをシンクしようとすると、ブラウザー インスタンスは、プログラムまたは UI を介した通信に応答しません。最も関連性の高い私の主な2つの方法を次に示します。
興味深いことに、私の C++ スキルは C# スキルと同じレベルではないため、これと同じメカニズムのプロトタイプを C# で作成してからアンマネージ C++ に変換しました。言うまでもなく、C# では問題なく動作しますが、このコンポーネントはアンマネージ コードで記述する必要があります。私は、.NET Framework が抽象化する明らかな何かを見落としていると確信していますが、それが何であれ、私には明らかではありません。
私の過ちから学ぶために、.NET Framework がこれを機能させるために行っていることへのポインタをいただければ幸いです。C# バージョンでは、私がここにいるのと同じように、パイプで I/O をブロックするシングル スレッドを使用しています。投稿されたコード スニペットが診断を示すのに十分でない場合は、問題を示す完全な Visual Studio 2008 ソリューションを喜んで提供します。
c++ - 依存関係なしで C++ で Web ブラウザを作成するには?
C++ で IE コントロールまたはある種の Web ブラウザを外部依存関係なしで使用するにはどうすればよいですか? つまり、純粋なwin APIなどで実行できますか? 私は C++ の基本を知っており、Web ブラウザー コントロールを使用する方法を知っているため、C++ ライブラリが機能する必要があります。
編集:
申し訳ありませんが、私の質問は不明確です。私は時々そのような初心者です。私が言いたいのは、コンパイルされた exe がすべてのウィンドウで動作し、ライブラリをインストールする必要がなく、コンパイルされた exe が dll と一緒に出荷される必要がなく、exe だけである必要があるということです。ベース Windows システムから動作するために必要なすべての依存関係 (つまり、winXP (または他のバージョン) の新規インストール)
c++ - イベント DISPID_TITLECHANGE から IWebBrowser2 ポインターを取得する
私はブラウザ ヘルパー オブジェクトに取り組んでおり、イベントを発生させる IWebBrowser2 にアクセスしようとしています。NavigateComplete2 やその他のイベントを使用すると、Invoke のパラメーターへのポインターを取得できるため、簡単に実行できます。
しかし、私はmsdn でこれを読んでいて、TitleChange イベントの唯一のパラメーターはタイトルであると言っているので、イベント TitleChange から webbrowser インターフェイスへのポインターを取得するにはどうすればよいですか?
他のイベントでそれを取得する方法は次のとおりです。
Visual Studio 2010 を使用しています。