プロが教えるわが家の防犯対策術!

お世話になります

親ウインドのHTAアプリケーション内にボタンを設置し、そのボタンを押すと”新たにHTAファイルを作成し”別ウインドとして生成したHTAアプリケーション画面を表示するようにしたいのです。(表示後は生成したHTAアプリケーションは削除する)
これ自体は、実現できたのですが、いくつか疑問点がありましたので、教えていただきたいです。

長くなるので、先に質問だけ記載します。1つでも良いので教えていただけると嬉しいです。

コード①の質問、終了していない文字列型の定数と表示されるのはなぜか?
コード②の質問、scriptの文字列が入らないように分割して変数に入れるとエラーが出ないのはなぜか?
コード③の質問、タグを記載したsample2.htaを生成し、runメソッドで起動したが、runメソッドの後にdeletefileメソッドを行なうと、inputタグを記載したにもかかわらず、テキストボックスが表示されないのはなぜか?
コード④の質問、sample2.htaを削除する手順を別プロシージャに分けたが、Callメソッドではテキストボックスが生成されず、SetTimeOutメソッドでは生成されるのは何故か?
(※④のコードで1秒後にdelfileプロシージャが呼び出されるわけではないのはわかっていますので、SetTimeOutメソッドの誤用は指摘しないで頂きたいです。)


以下、ボタンを押しonclickイベントで呼び出されるプロシージャのみ記載します。

①最初に書いたコード、「終了していない文字列型の定数」エラーが出るのは何故?
sub sample
set fso = CreateObject("Scripting.FileSystemObject")
set sh = CreateObject("Wscript.Shell")
set Mhta = fso.opentextfile("C:\sample2.hta",2,true)

Mhta.Writeline "<body><script type=""text/vbscript""></script><input type=""text""></body>"
Mhta.close
sh.run "mshta.exe C:\sample2.hta"
End sub

②Writelineの内容を試行錯誤した結果、scriptと記載が入っているとNGなようなので、scriptという文字列が入らないように変数に分割して結合。エラーが出ないので上の理論は合ってる?

sub sample
set fso = CreateObject("Scripting.FileSystemObject")
set sh = CreateObject("Wscript.Shell")
set Mhta = fso.opentextfile("C:\sample2.hta",2,true)

a = "<body><scrip"
b = "t type=""text/vbscrip"
c = "t""></scrip"
d = "t><input type=""text""></body>"
Mhta.Writeline a&b&c&d
Mhta.close
sh.run "mshta.exe C:\sample2.hta"
end sub

③ボタンクリックにてsample2.htaを表示後、生成したsample2.htaファイルを削除したいので、 end subの1行前に以下のコードを追記、何故かsample2.htaにテキストボックスが表示されない

fso.deletefile "C:\sample2.hta"

④起動前にファイルが削除されてしまっているのかと思い、削除を別プロシージャに分けたところ、callメソッドではテキストボックスが生成されないが、SetTimeOutでは生成されるのはなぜか

fso.deletefile "C:\sample2.hta"  の代わりに、delfileプロシージャを呼び出す2例

(ⅰ) Callメソッドを用いた場合(sample2.htaウインドにはテキストボックスは表示されない)
Call delfile
end sub

sub delfile
set fso = CreateObject("Scripting.FileSystemObject")
fso.deletefile "C:\sample2.hta"
set fso = nothing
end sub

(ⅱ)setTimeOutを用いた場合(sample2.htaウインドにはテキストボックスが表示される)
setTimeOut "delfile",1000
end sub

sub delfile
set fso = CreateObject("Scripting.FileSystemObject")
fso.deletefile "C:\sample2.hta"
set fso = nothing
end sub

以上です、よろしくお願いします。

A 回答 (1件)

①②について、


</script>という文字があるとダメみたいですね。たぶんsample1.htaの冒頭の<script ~>に対応する閉じタグと誤認識されるではないかと。
スクリプトを書くエリアの部分を以下にしたらOKでした。
-------------------
<html>
<head>
<script language="vbscript"> ' ここは元のままでも良いかも
<!-- ' htmlのコメント開始の記号を追加する

 ここにvbscriptを書く

--> ' htmlのコメント終了の記号を追加する
</script>
</head>
<body>
以下略
-----------------------------



③④について
sh.runの第三引数をtrueにすると起動したプログラム(mshta.exe)が終了するまで、スクリプトの実行が停止するので、その直後でファイル削除してもイケます。
詳細はMSDNを参照してくだい(https://msdn.microsoft.com/ja-jp/library/cc36442 …

-----------------------------
sh.run "mshta.exe C:\sample2.hta", 1, true
fso.deletefile "C:\sample2.hta"
-----------------------------
    • good
    • 0
この回答へのお礼

ご回答有り難うございます。
HTAは寛容性が高い分、<!--  -->のように明示的に記載しないといけないのですね。
これで見栄えの悪いコードを書かずに済みそうです、ありがとうございました。

③④については、やはり実行速度の差というところでしょうか。

お礼日時:2016/01/31 20:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています