HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0630
morimoriCOM操作での挙動の違い7解決


morimori

リンク

2017/6/30(Fri) 21:16:29|NO.80448

お世話になっております。
COMでhtmlの内容を取得しています。

newcom objIE, "InternetExplorer.Application"
objIE("Visible") = 1 にしておけば表示はされないのですが、urlファイルを実行されたときに
それが表示されて、意図しない動作になってしまいます。そこで、以下の

axobj objIE, "Shell.Explorer.2",640,480

を試してみましたが、スクリプト


o=objIE("Document") o=o("frames") o=o("left") o=o("Document") o=o("body") HTML=o("innerHTML")
が通らなくなってしましました。
前者では問題なかったのですが、後者では o=o("body") のところでエラーが出ます。
どのように解決できるのでしょうか。

目的はurlショートカットの実行で、使用しているIEが表示するのを防止したいだけなのですが。

よろしくお願いいたします。

環境:Windows7,IE11



この記事に返信する


田宮

リンク

2017/7/1(Sat) 18:04:11|NO.80462

IEが表示?



MIZUSHIKI

リンク

2017/7/1(Sat) 21:41:42|NO.80464

記述は問題ないような気がします。
以下テストスクリプトです。

#define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" #define DISPID_DocumentComplete 259 axobj ieBrowser,"Shell.Explorer.2",640,480 //ieコンポーネント起動 comevent ieEvent, ieBrowser, DIID_DWebBrowserEvents2, *event //COMイベントの取得開始を登録 url = "http://suwa.pupu.jp/DownLoad_frame.html" // frameを使った適当なサイトを見つけられなかったので、私のホームページで(^^; ieBrowser->"Navigate" url,,,,"" //指定URLに移動 stop *event // COMイベント処理 dispid = comevdisp(ieEvent) //イベントIDを取得 if dispid = DISPID_DocumentComplete : gosub *OnDocumentComplete //ドキュメントの読み込み完了時 return *OnDocumentComplete comevarg newurl, ieEvent, 1, 1 //URLを取得 if newurl == "http://suwa.pupu.jp/DownLoad_frame.html" { o = ieBrowser("Document") o=o("frames") o=o("hidari") o=o("Document") o=o("body") HTML=o("innerHTML") dialog html } return

COM方面にまで手を出している方は少ないと思うので、テストスクリプト(問題の発生する最小限のもの)を付けると回答を得やすいと思います。
今回は、urlファイルのショートカット先に問題があるような無いような?



sot

リンク

2017/7/1(Sat) 22:01:07|NO.80467

axobjで作ったブラウザはデフォルトでIE7相当なのでそれが原因じゃないかと思います。
レジストリを変更してIE11相当にすればいいかと思います。

詳しくはこの辺のサイトで
http://www2.hatenadiary.jp/entry/2013/12/20/114342
http://blog.systemjp.net/entry/2015/12/11/172750



morimori

リンク

2017/7/4(Tue) 21:13:39|NO.80496

すみません、返信が遅れてしまいました。

>田宮さん
HSPのプログラムから起動させた非表示のIEが、ユーザーがurlファイルを開くことで
非表示にしていたIEが表示されて、隣のタブに開かれてしまうということです。

>MIZUSHIKIさん
返信ありがとうございます。
テストスクリプトは正常に動作しましたが、目的のWEBサイトではエラーになってしまいました。
MIZUSHIKIのHPのソースを見る限り目的のWEBページと同じ構造になってるので、何が原因なのか不明です。
ちなみに目的のページはaspxが拡張子のページです。(ここらへん詳しくない)

urlファイルを実行するのはPC側なので、ショートカット先は関係ないような?

>sotさん
返信ありがとうございます。
確かにバージョンが違ってました。
レジストリでhsp3.exeを追加したところ、バージョンがIE11になったのは確認できましたが、
動作は変わらずエラーが出てしまいました。
なぜなのでしょうね。IEでCOM操作するときはきちんと動くのに…



とりあえず、いまのところIEでしか操作ができないので、手法を変えたいのですが、
ユーザーがurlファイルを開いたときにHSPでCOM操作しているIEを使用させない
(IEのウインドウを再利用しないようにする)方法はないでしょうか。
ユーザーがわからないと思うので、urlファイルをいじるというのは難しいです。
よろしくお願いいたします。



morimori

リンク

2017/7/4(Tue) 21:15:57|NO.80497

すみません、MIZUSHIKI「さん」が抜けてました。申し訳ないです。



MIZUSHIKI

リンク

2017/7/6(Thu) 18:00:29|NO.80515

>newcom objIE, "InternetExplorer.Application"
>ユーザーがurlファイルを開いたときにHSPでCOM操作しているIEを使用させない
>(IEのウインドウを再利用しないようにする)方法

おそらくコチラの方法でアプローチしていった方が良いような気はしますが、私のWindows10の環境では、urlファイルを実行してもedgeが立ち上がってしまい検証することができませんでした。

なので、
>axobj objIE, "Shell.Explorer.2",640,480
側の方を引き続き調べてみました。

下記スクリプトを実行してみてください。

#define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" #define DISPID_DocumentComplete 259 axobj ieBrowser,"Shell.Explorer.2",640,480 //ieコンポーネント起動 comevent ieEvent, ieBrowser, DIID_DWebBrowserEvents2, *event //COMイベントの取得開始を登録 url = "http://www.iwebmethod.net/insider.net/aspnet/08/sample03.htm" // frame name=left でaspxを指定されたものを見つけてきた。 ieBrowser->"Navigate" url,,,,"" //指定URLに移動 stop *event // COMイベント処理 dispid = comevdisp(ieEvent) //イベントIDを取得 if dispid = DISPID_DocumentComplete : gosub *OnDocumentComplete //ドキュメントの読み込み完了時 return *OnDocumentComplete comevarg newurl, ieEvent, 1, 1 //URLを取得 if newurl == url { oDocument = ieBrowser("Document") ;oだけだと分かりにくいので名前を分けました。 oFrames = oDocument("frames") oLeft = oFrames("left") oLeftDocument = oLeft("Document") oLeftElements = oLeftDocument("getElementsByTagName","*") ;各HTMLタグ要素を取得 count = oLeftElements("length") if count = 0 : return tags="" repeat count node = oLeftElements("item", cnt) tags+= node("nodeName")+", " ;HTMLタグ名を取得 if node("nodeName")=="HTML" :nodeHTML=node loop dialog tags,,"各タグ要素" ;各HTMLタグ要素を列挙 dialog nodeHTML("innerHTML"),,"htmlタグ中身" ;htmlタグの中身を表示 } return
frame name=left でaspxを指定しているところを見つけてきました。
上記のスクリプトは、aspxファイルの中の各HTMLタグ要素を取得して表示しています。

url変数の中身をうまくいかないというURL先に変更してみてください。
問題なく動きますでしょうか。
また、列挙される物の中にbodyタグはありますか。

スクリプトでは、bodyがダメならばとhmtl要素の中身の表示も試みています。

> o=o("Document")
> o=o("body") //←ここでエラー
ということでしたので、ドキュメントの取得までは行っているのかな、ならaspxにbody要素がないんじゃないかな、と考えました。

ただ、
> newcom objIE, "InternetExplorer.Application"
では問題なかったんですよね?
なので違うとは思うんですけど、一応確認してみてください。。。

・・・というか今更ですけど、特定のaspxのurl先でのみのエラーですか?aspxなら全て全滅ですか?
支障がなければ、エラーが出てしまうURL先を教えて欲しいのですが。



morimori

リンク

2017/7/7(Fri) 23:11:19|NO.80528

>MIZUSHIKIさん

検証していただきまして、ありがとうございます。
提示していただいたスクリプトは実行できましたが、URLを変えて実行するとHSPが落ちるので、
以下のようにしました。リンク先ですが、一部の会員向けサイトで、外部ユーザーは入れないようです。


axobj ieBrowser,"Shell.Explorer.2",640,480 //ieコンポーネント起動 url = " " //URLは伏せます ieBrowser->"Navigate" url,,,,"" //指定URLに移動 wait 500 oDocument = ieBrowser("Document") ;oだけだと分かりにくいので名前を分けました。 oFrames = oDocument("frames") oLeft = oFrames("left") oLeftDocument = oLeft("Document") oLeftElements = oLeftDocument("getElementsByTagName","*") ;各HTMLタグ要素を取得 count = oLeftElements("length") if count = 0 : return tags="" repeat count node = oLeftElements("item", cnt) tags+= node("nodeName")+", " ;HTMLタグ名を取得 if node("nodeName")=="HTML" :nodeHTML=node loop dialog tags,,"各タグ要素" ;各HTMLタグ要素を列挙 dialog nodeHTML("innerHTML"),,"htmlタグ中身" ;htmlタグの中身を表示

getElementsByTagNameのところでやはりエラー30(無効な名前がパラメーターに指定されています)がでます。

左フレームのソースには

<html> <head>~</head> <body class="leftbody" style="-ms-overflow-y: auto;" onkeydown="event_listOnkeyDown(event);" onkeyup="event_listOnkeyUp(event);"> (ズラズラ) </body> </html>

というようにBody要素はあるのですが、やはり取得してくれません。

Shell.Explorer.2ではうまくいかないようなので、諦めます。
MIZUSHIKIさん、わざわざスクリプトから検証からありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.