C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.47882 の関連記事表示

<< 0 >>
■47882  IDisplayServicesへのキャスト方法
□投稿者/ jyo -(2010/03/17(Wed) 04:34:31)

    分類:[C#] 

    [開発環境:VisualStudio2008 standard .NET framework3.5]

    はじめまして。
    IHTMLDocument2インタフェースをIDisplayServicesにキャストする方法について質問させてください。

    すでに起動しているIEをハンドリングして、とあるhtmlエレメントの座標を取得しようとしています。
    IEがフレーム構成の場合に座標の補正を行うため、IDisplayServicesインタフェースのTransformPointメソッドを利用しようとしています。
    IDisplayServicesはIHTMLDocument2からキャストが出来るようなのですが、InvalidCastExceptionで失敗してしまいます。
    http://msdn.microsoft.com/en-us/library/aa752659(VS.85).aspx)

    ○失敗するコード
      ShellWindows sw = new ShellWindows();
      SHDocVw.WebBrowser _ie;

      //_ieにShellWindowsから取得したIEを代入(中略)

      IHTMLDocument2 ihd2 = _ie.Document as IHTMLDocument2;
      IDisplayServices ids = ihd2 as IDisplayServices;

    一方、System.Windows.Forms.WebBrowserから取得できるDocumentオブジェクトは、キャストが成功します。
    ○成功するコード
      WebBrowser webBrowser1 = new WebBrowser();
      webBrowser1.Navigate("URL");
      IHTMLElement elm = webBrowser1.Document.GetElementById("適当なid").DomElement as IHTMLElement;
      IHTMLDocument2 doc2 = elm.document as IHTMLDocument2;
      IDisplayServices ids2 = doc2 as IDisplayServices;

    質問内容ですが、
     System.Windows.Forms.WebBrowserからならキャスト可能、SHDocVw.WebBrowserからはキャスト不可のように思えますが、コードにおかしな個所は無いでしょうか?
     プログラム中でIEを起動するのではなく、すでに起動しているIEのエレメントからIDisplayServicesへ持っていく方法はあるでしょうか?
     そもそもブラウザがフレーム構成の場合のエレメントの座標の取得方法が別にあるようでしたら、教えていただけますか?

    ---
    似たような話題はいくつか見つけましたが、どれも解決していないようでした。
    ・起動済のIEから.NET FrameworkのHtmlDocument → ムリ
     http://okwave.jp/qa/q3873841.html
    ・WebClient で得た HTML を HtmlDocument で解析したいが WebBrowser がないと使えない?
     http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45032&forum=7
    ・cross-process martharingはムリ?
     http://social.msdn.microsoft.com/Forums/en/ieextensiondevelopment/thread/2d158f90-df91-444b-a697-9325bad6ec36
    ・同じような問題(未解決)
     http://www.itwriting.com/phorum/read.php?3,1775,3398,quote=1
親記事 /過去ログ81より / 関連記事表示
削除チェック/

■47883  Re[1]: IDisplayServicesへのキャスト方法
□投稿者/ Jitta on the way -(2010/03/17(Wed) 06:57:06)
    No47882 (jyo さん) に返信

    リンク先等は見ていません。
    そもそも、IDisplayServices と IHTMLDocument2 に、互換性が有るのでしょうか?何でもかんでも、投げつければ(cast)変型するわけではありません。元のオブジェクトに互換性がある場合に変換できます。互換性があるかどうかは、型の仕様を見れば載っています。互換性があること(この場合、SHDocVw.WebBrowser と IDisplayServices との間に)は、確認済みなのでしょうか。
記事No.47882 のレス /過去ログ81より / 関連記事表示
削除チェック/

■47910  Re[2]: IDisplayServicesへのキャスト方法
□投稿者/ jyo -(2010/03/17(Wed) 18:35:56)
    No47883 (Jitta on the way さん) に返信
    > ■No47882 (jyo さん) に返信
    >
    > リンク先等は見ていません。
    > そもそも、IDisplayServices と IHTMLDocument2 に、互換性が有るのでしょうか?何でもかんでも、投げつければ(cast)変型するわけではありません。元のオブジェクトに互換性がある場合に変換できます。互換性があるかどうかは、型の仕様を見れば載っています。互換性があること(この場合、SHDocVw.WebBrowser と IDisplayServices との間に)は、確認済みなのでしょうか。

    返信ありがとうございます。
    MSDNでは、IDisplayServiceへのポインタを取得するにはIHTMLDocument2インタフェースへのポインタに対してCOMのQueryInterfaceを行うこと、と書かれています。
    C#ではこれをキャストで実現していますが、うまく行く場合とうまく行かない場合があるということです。
    (なので2つのインタフェース自体に互換性はないと思います。)

    IHTMLDocument2ならば常にIDisplayServicesへのキャストはできる・・・というわけではないんでしょうね。。
記事No.47882 のレス /過去ログ81より / 関連記事表示
削除チェック/

■47915  Re[1]: IDisplayServicesへのキャスト方法
□投稿者/ 魔界の仮面弁士 -(2010/03/17(Wed) 19:32:19)
記事No.47882 のレス /過去ログ81より / 関連記事表示
削除チェック/

■48011  Re[2]: IDisplayServicesへのキャスト方法
□投稿者/ jyo -(2010/03/19(Fri) 20:48:29)
記事No.47882 のレス /過去ログ81より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -