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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0818
(´ω`)COMオブジェクト絡みの不思議な動作6解決


(´ω`)

リンク

2016/8/18(Thu) 13:29:55|NO.76629

COMオブジェクト絡みの動作で、ちょっと不思議なのを見つけたので
ご報告というか……(´・ω・`)


#module "mWeb" // Web表示ダイアログ(scr 6) #define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" ; mWeb_init ; Webダイアログ初期化 #deffunc mWeb_init bgscr 6, 640, 480, , 0, 0 pos 0, 0 : axobj axIE, "Shell.Explorer.2", 640, 480 comevent ie_event, axIE, DIID_DWebBrowserEvents2, *event_IE return *event_IE dispid = comevdisp(ie_event) return #global mWeb_init axIE@mWeb -> "Navigate" "http://www.google.com" dialog "ハイ!" end dialog "ハイ!ハイ!"
上記ソース、一読すると「ハイ!」とダイアログ表示されたら終了するように見えますが、
ダイアログのOKボタンを押すタイミングによっては、次のendが無視されて「ハイ!ハイ!」
が表示されてしまうのです。
当方の実行環境はHSP 3.32b、Windows8.1 64bit になります。

モジュールになってるのは、ソースから抜き出してきた以上の意味はないです。

どうも、COMオブジェクトの処理により、ナンジャカンジャが起きるようなのですが、
一体何が起きて次のコードが無視されてしまうんだろう、という。

バグ……なのかな?
いちおうご報告ということで。(´ω`)



この記事に返信する


(´ω`)

リンク

2016/8/18(Thu) 13:44:33|NO.76630

一応、非モジュール化してみましたが、やはり同様の問題が発生します。
以下ソースで「ハイ!ハイ!」の後にエラーが表示されます。
また、対象のサイトを変更して色々試したところ、どうやらオブジェクト内で描画中の
タイミングでOKを押すとendが無視されてしまうようです。


#define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" bgscr 6, 640, 480, , 0, 0 pos 0, 0 : axobj axIE, "Shell.Explorer.2", 640, 480 comevent ie_event, axIE, DIID_DWebBrowserEvents2, *event_IE axIE -> "Navigate" "http://www.asahi.com/" dialog "ハイ!" end dialog "ハイ!ハイ!" *event_IE dispid = comevdisp(ie_event) return
以上、宜しくお願いいたします。(´・ω・`)



InoueSoftware

リンク

2016/8/18(Thu) 14:17:51|NO.76631

「dialog "ハイ!"」と「end」の間に「await 1」を入れると、問題が改善されましたが、
原因は分かりません。



(´ω`)

リンク

2016/8/18(Thu) 17:42:15|NO.76637

ご確認いただき、ありがとうございます。(´ω`)

もしかして、end命令自体がWindowsの割り込み機能を使っていて、
COMオブジェクトの描画中は割り込みが殺されてる、とかいうことかしら。
だから、await命令で処理待ちをすると問題なく終了する……?

何とも不思議な現象です。(´・ω・`)



千本桜

リンク

2016/8/18(Thu) 23:49:34|NO.76643

3.0の頃にも同じ現象があったなぁ(^^;原因は忘れたけど・・・・
endを抜ける現象。


dialog "ハイ!" end end dialog "ハイ!ハイ!"
当時は、対策としてendを2つ入れて誤魔化していた(笑)



ato

リンク

2016/8/19(Fri) 05:03:46|NO.76647

このスクリプトでボタンを押すと、acbの順で文字が表示されるので
end実行時に未処理の割り込みが残ってるとそっちに処理が行ってしまうみたいです。
で割り込みから帰ってくるのはendの次の命令になるのですり抜けてしまうと。

#include "user32.as" #define WM_USER $00000400 oncmd gosub *lblcmd,WM_USER button gosub "",*lblbtn stop *lblbtn PostMessage hwnd,WM_USER,0,0 mes "a" end mes "b" return *lblcmd mes "c" return



(´ω`)

リンク

2016/8/19(Fri) 06:42:08|NO.76649

なるほど!( ゚ω゚ )

comevent命令も割り込み処理なので、同様の現象が発生する、ということか……
atoさんのソースでも、PostMessageの後にawitを入れると、正常に動きますね。

だいぶすっきりしました!(´ω`)



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