いりや さん 2004年 06月 24日 01時 07分 42秒

vagabond さん、

| これだと「OK」のボタンを押した時は正常に動くのですが、パスワード入力直後にEnter
| してしまうと、真っ白な表示になるだけで、動きが止っていまうのです。

こちらも確認しました。これは

  ><form><input type='password' name='Password'></form>
   ^^^^^^

パスワード入力直後に Enter キーを押下すると、上の form オブジェクトに対して
onSubmit イベントが発行されますが form オブジェクトの action/method プロパティー
が空なので about:blank が再表示される (⇔真っ白な表示になる) 格好になっているこ
とが予想されます。Dynamic HTML Object Model のはなしですね。

ではそもそも form オブジェクトを用意したのか。

その過去経緯を知らないのでその狙いが分からないので、ユーザーインタイフェイス上
の要件を

(1) OK ボタンを押下したら evtOK イベントハンドラ (Sub) を実行する
(2) Cancel ボタンを押下したら evtCancel イベントハンドラ (Sub) を実行する
(3) ユーザ名の入力欄において Enter キーを押下しても何も起きない
(4) パスワードの入力欄において Enter キーを押下しても何も起きない

という前提でお話します。

二つの対応策が考えられます。(a) の方が話がはやいかな。

(a) form オブジェクトを消す

特徴: これによって Enter キーを押下したときの onSubmit の発生そのものがなくなり
結果として abount:blank の再表示も起きなくなります。

変更前: "<tr><td>パスワード</td><td><form><input type='password' name='Password'></form></td></tr>" & _
変更後: "<tr><td>パスワード</td><td><input type='password' name='Password'></td></tr>" & _


(b) form オブジェクトの onsubmit イベントハンドラで false を返す

特徴: クライアント側で、フォームの入力値を検査して、もし検査に通らない場合はサー
バへの送信 (submit) をとりやめる、ということはウェブ・アプリケーションのプログ
ラミングでよく発生します。そのとき onsubmit イベントハンドラを書き換えて実現す
る方法が msdn で紹介されています。

    http://msdn.microsoft.com/workshop/author/dhtml/reference/events/onsubmit.asp

こちらの Remarks に書かれてある仕様に合致するように毎回 false を返す (送信をと
りやめる) ような関数を form オブジェクト (id=form1) の onsubmit イベントハンド
ラに設定しています。

変更前: "<tr><td>パスワード</td><td><form><input type='password' name='Password'></form></td></tr>" & _
変更後: "<tr><td>パスワード</td><td><form id='form1'><input type='password' name='Password'></form></td></tr>" & _

変更前: Set .document.all.cmdOK.onclick = GetRef("evtOK")

変更後: Set .document.all.cmdOK.onclick = GetRef("evtOK")
   : Set .document.all.form1.onsubmit = GetRef("evtOnSubmit")

追 加: Function evtOnSubmit
        evtOnSubmit = false
   : End Function

※ コピー&ペーストする際に全角スペースは半角スペース二つに置き換えください。

vagabond さん 2004年 06月 23日 20時 02分 58秒


こんにちは。
かなり前になるのですが、ドメイン下のファイルサーバにドライブマップさせるスクリプトを作りたくて、こちらの掲示板でご助言頂いて、以下のスクリプトを作りました。

Dim moWindow,WshShell
Dim mbFinished,mbOK,mbUID,mbPass,CR,str1,str2,str3,str4,str5
Set moWindow = WScript.CreateObject("InternetExplorer.Application", "IE_")
Set WshShell = Wscript.CreateObject("Wscript.Shell")
CR = CHR(13)&CHR(10)
moWindow.Navigate2 "about:blank"
Do
WScript.Sleep 1000
Loop while moWindow.Busy
With moWindow.Document.ParentWindow
.Document.Write "<html><head></head><body><table>" & _
"<tr><td>ユーザー名</td><td><input type='textbox' name='UserID'></td></tr>" & _
"<tr><td>パスワード</td><td><form><input type='password' name='Password'></form></td></tr>" & _
"</table><br><br>" & _
"<input type='button' value=' OK 'class='ok' id='cmdOK'/> " & _
"<input type='button' value='CANCEL' class='cancel' id='cmdCancel'/>" & _
"</body></html>"
.MoveTo .Screen.AvailWidth/2-150,.Screen.AvailHeight/2-150
.ResizeTo 300,200
.Document.Title ="ネットワークドライブマップ"
End With
With moWindow
.Toolbar = False
.Statusbar = False
.Menubar = False
.Visible = True
.Resizable = False
Set .document.all.cmdCancel.onclick = GetRef("evtCancel")
Set .document.all.cmdOK.onclick = GetRef("evtOK")
.Document.All.UserID.Focus
End With
mbFinished = False
Do
WScript.Sleep 50
If mbFinished Then Exit Do
Loop
Set moWindow = Nothing
If mbOK Then
WshShell.Run "net use * /delete /y",0,1
Wscript.Sleep 1000
WshShell.Run "net use k: \\サーバー名\共有名 /user:ドメイン名\"&mbuID&" "&mbPASS&" /persistent:no",0,1
Wscript.Sleep 2000
WshShell.Run "explorer /e, K:\"
Else
Msgbox "Canceled"
End If
'イベント
Sub evtCancel
mbFinished = True
moWindow.Quit
End Sub
Sub evtOK
mbUID = moWindow.Document.All.UserID.Value
mbPASS = moWindow.Document.All.Password.Value
mbOK = True
mbFinished = True
moWindow.Quit
End Sub
Sub IE_onQuit
mbFinished = True
End Sub

実はこれ、色々やり取りしてるうちに、こちらの掲示板でレスを下さった親切な方が、ほとんどの部分を作ってくれちゃったんです・・・
(お名前は忘れましたが、本当にありがとうございました。特に不具合なく動いています)
最初はVBSのみで作ろうとしたのですが、どうしても入力中のパスワードを隠す事が出来ず、このようにVBS/JS/WSH/NTコマンドを駆使した複雑なものになってしまったのです。
ただ、機能的にはほぼイケてるのですが、以前より一つだけ問題がありまして・・・
これだと「OK」のボタンを押した時は正常に動くのですが、パスワード入力直後にEnterしてしまうと、真っ白な表示になるだけで、動きが止っていまうのです。
VBSしか分からない私には、何をどう修正すればいいか見当がつかず、ちょっと困っています。
丸投げかよ、という声が聞こえてきそうですが、どなたか適切なアドバイスを頂けないでしょうか。



いりや さん 2004年 06月 23日 17時 47分 14秒

KK さん、

WshScriptExec を検討してみてはいかがでしょうか。

http://hidebbs.net/bbs/umiumi?n=23498545&s=7

こちらの「Re:VBS−>UWSC変換について いりや 【2004/06/07 01:44:23】」がその解説になっています。

KK さん 2004年 06月 23日 17時 03分 42秒

はじめまして、WSHにて並列処理を行なおうとしています(バッチ処理です)

strCmdnameには、起動されるWSHが格納されています。

rc = objWshShell.run(strCmdname1, 0, FALSE)
rc = objWshShell.run(strCmdname2, 0, TRUE)

そこで、1つのスクリプトファイルより、上記のように、連続で2つのコマンドを
実行したところ、TRUEで実行した場合は、エラーを返しますが、FALSEで実行したほうは、当然のことながら、エラーは、rcに帰ってきません。

このような場合、FALSEで実行したWSHがエラーを検知した場合は、エラーをハンドリングするのは、できないのでしょうか?

よろしくお願いします。

oo さん 2004年 06月 23日 02時 07分 50秒

>> WSHを使用して,リモートシェル(RSH)で起動したシェルスクリプトの
>> 終了コードを取得したいのですが,
>WshShell.Runメソッドの返り値が終了コードになります。
>これで取得できないでしょうか?

それだと、rsh自体の終了コード(リモートホストと通信できないとか、ユーザー権限が無いとかなら非0で、リモートでスクリプトが起動できれば0)しかわかりません。
リモートホストで実行したスクリプトの終了コードを知るためには、そのスクリプトの最後で終了コードを標準出力に文字列として書き出し、呼び出し側でその文字列を読み取って判断する必要があります。
クォートに注意すれば rsh host 'remote-script-name; echo $?' とかでもいいはず。
WshShell.Execして、そのStdOutプロパティをReadするんでしょうか。

管理人むたぐち さん 2004年 06月 22日 18時 33分 45秒

To: あっぺ さん

> WSHを使用して,リモートシェル(RSH)で起動したシェルスクリプトの
> 終了コードを取得したいのですが,

WshShell.Runメソッドの返り値が終了コードになります。
これで取得できないでしょうか?

管理人むたぐち さん 2004年 06月 22日 18時 28分 31秒

窓の杜 - 【NEWS】誰でも気軽に参加できる「日本語プログラミングコンテスト」が開催
http://www.forest.impress.co.jp/article/2004/06/22/jpndevelopcontest.html

> 日本語プログラミングコンテスト実行委員会は、日本語で記述するプログラミング言語「ひまわり」「TTSneo」「Mind」「言霊」のいずれかを用いて作成したプログラムのコンテスト「日本語プログラミングコンテスト」の応募を開始した。作品の応募は6月1日から開始されており、8月31日に応募が締め切られる。

そんな委員会があったことも驚きなんですけど、こんなコンテストが
開催中だそうです。日本語プログラミングに興味のある方は参加してみてはどうでしょうか。
言霊って知らなかったんですが、こういうものだそうです。

日本語プログラム言語 言霊
http://www.crew.sfc.keio.ac.jp/projects/kotodama/

まだそれほど多くのことはできないみたいですが、何となく言語名がいいですね。


           =-=-=-=-=-=-=-=


EmEditor v4 Professional(http://www.emeditor.com/jp/)では、マクロとして
WSHが使えるということは以前この掲示板でもお伝えしましたが、このたび、
私もこのv4 Proを使い始めました。

http://www.emeditor.com/jp/register.htm
ここの、「テクニカル ライセンス」を申請して取得しました。
私がフリーソフト作家だというのはちょっとおこがましいかな、
とも思ったんですけど、まあEmEditorのマクロを公開してる人も対象とあったので、
それなら似たようなものだと思いまして。
学生の方は「アカデミック ライセンス」もあります。いずれも無料です。

ドキュメントモデルを見ると、Document Object Model HTML に類似しており、
HTMLでスクリプトを書いたことがあるなら、容易に使いこなせると思います。
何か使えそうなマクロができたら、ここでも公開してみようかと思います。

あっぺ さん 2004年 06月 22日 11時 22分 42秒

お世話になっております.
VB6.0 SP5
WSHを使用して,リモートシェル(RSH)で起動したシェルスクリプトの終了コードを取得したいのですが,どういった方法を使用していいのかわかりません.
ご存知の方,ご教授お願い致します.

Onyo さん 2004年 06月 22日 10時 45分 28秒

すみません。過去ログにありました。
ご心配おかけいたしました。
ありがとうございました。

Onyo さん (tsuyoshi-o@k7.dion.ne.jp) 2004年 06月 22日 10時 39分 03秒

WSHの機能で、ローカルのIPアドレスを取得するメソッドは
ありませんでしょうか。
ご存知の方ご指導ご鞭撻の程よろしくお願いいたします。

凡児 さん 2004年 06月 22日 09時 13分 50秒

むたぐちさん、ありがとうございました。気長にお待ちします。
GIFの件も感謝です。HTMLに出来るだけ使わないようにして来た
のですがこれからは自由ですね。

御礼まで

管理人むたぐち さん 2004年 06月 21日 23時 21分 29秒

Unisysの“GIF特許”、日本でも6月20日で失効
http://internet.watch.impress.co.jp/cda/news/2004/06/21/3574.html

LZW特許がついに失効したということです。
これからは安心してGIFが使えますね。


To: 凡児 さん

> 古いDOSのアプリをW2KやXPで全面表示起動させたい場合はどうしたら
> 良いのでしょうか?

これは私には分かりません。
詳しい方のフォローを待ちましょう。

凡児 さん 2004年 06月 21日 11時 26分 28秒

古いDOSのアプリをW2KやXPで全面表示起動させたい場合はどうしたら
良いのでしょうか?

W98だとアプリやバッチのプロパテイで直接画面サイズの変更が出来
ましたがW2KやXPは見当たりません。 まず c:\winnt\system32\cmd.exe
のプロパテイ・画面サイズを変えておき、まずシェルで全面白黒画面を
立ち上げ、そこから手動でアプリなりバッチを起動すると見事に全画面
になりますが、ShellRunで起こすと元に戻ってしまいます。

もう古いDOSのアプリでは無理なのでしょうか?何方かご意見お聞かせ
下さい。

ばんのしゃーによかばんた さん 2004年 06月 20日 21時 28分 43秒

>Hiro さん 2004年 06月 09日 12時 33分 59秒
>URLを送信して、IEアプリでそのリンク先を開き(非表示でも良い)、
>そのViewSource HTMLソースを、指定するディレクトリに、指定する名前で、
>HTMLテキスト書類として作成する。最後に使用アプリを閉じて、終了。

これですが、その近傍の記事、

>ばんのしゃーによかばんた さん 2004年 06月 09日 14時 20分 57秒
>これは、「DHTMLEditコントロール」のLoadDocumentですね。

のところを、LoadURLで取り出して、SaveDocumentで格納する。

というのはどうでしょう。

名前からすると、この用途にぴったりの機能です。
ただ、HTMLソースは少し変更されるようです。と言っても、
document.body.parentElement.outerHTML よりは、まだオリジナルに近いようです。

Set fso=CreateObject("Scripting.FileSystemObject")
Set ie=CreateObject("InternetExplorer.Application")
'ie.Navigate "about:blank"
ie.Navigate "res://mshtml.dll/blank.htm"
'ie.Navigate "res://" & fso.GetSpecialFolder(1).Path & "\mshtml.dll/blank.htm"
Do While ie.Busy Or ie.ReadyState<>4
: : WScript.Sleep 100
Loop
'ie.Visible=True
Set dhtmled=ie.Document.CreateElement("object")
dhtmled.classid="CLSID:2D360200-FFF5-11D1-8D03-00A0C959BC0A"
call ie.document.body.insertadjacentelement("AfterBegin",dhtmled)
dhtmled.LoadURL "http://hoge/hoge.htm"
Do While dhtmled.busy
: : WScript.Sleep 100
Loop
Set Document=dhtmled.DOM
dhtmled.SaveDocument fso.GetAbsolutePathName("hoge.htm")
ie.Quit
Wscript.Quit

ファイル格納でなく、タイトルだけ知りたければ、
dhtmled.DocumentTitle
HTMLソースは、
dhtmled.DocumentHTML
で参照できます。

また、
document.charset="shift_jis"
などして、dhtmled.SaveDocumentすれば、コード変換ができます。
ただし、<META〜charset= はそのまま変わらずなので別途変更が必要。

HTMLソースの変更を気にしなければ、多少インチキぽいですが、
dhtmled.DocumentHTML=document.body.parentElement.outerHTML
として、dhtmled.SaveDocumentすれば、<META〜charset=なども変わります。

管理人むたぐち さん 2004年 06月 18日 15時 38分 41秒

C#でCGIプログラムを書いているんですが、なかなか大変です。
ASP.NETではありません。CでCGIプログラムを書くノリで、
C#で書いてみてるんです。

というのも、C#の練習のために何か作ろうと思ったのですが、
Hello Worldに毛の生えたようなプログラムを組んでも楽しくないし、
かといってC# Builderを使って有用なアプリケーションを書くと
いうほどの野望もないので、コンソールアプリケーションだけど
それなりに楽しめそうなCGIプログラムを、と思ったのです。

この前はWSHでやりました(過去記事81を参照)ので、その延長ですね。
# こんなページを発見しました。
# 【 WSHをCGIとして使う 】http://hp.vector.co.jp/authors/VA003334/vb/cscript.htm
# WSHBBS(ダウンロードページに登録)とほぼ同じ手法ですが、こちらはwsfで纏められています。

using System;
using System.Collections;
using System.Text;
using System.Web;
using http = System.Web.HttpUtility;

class Test{
static void Main(string[] args) {
Encoding sjis = Encoding.GetEncoding("Shift_JIS");
Console.WriteLine ("Content-Type: text/html\n\n");
IDictionary env = Environment.GetEnvironmentVariables();
Console.WriteLine (http.UrlDecode(env["QUERY_STRING"].ToString(),sjis));
}
}

この辺で止まっています。
とりあえず、環境変数"QUERY_STRING"を読んで、デコードした文字列を取得
して出力というところまでです。このあと、&でsplitして=でsplitして
QueryのDictionaryを作ったりしようと思います。
なんか根本的に間違ってるようなら誰か突っ込んでください。
コードがVBSの発想を引きずりまくりなのはご愛嬌ということで…。
# ASP.NET関係で、こういう処理を一気にやってしまうオブジェクト
# とかありそうだしなあ…

なお、コンパイルにはDSH(過去記事88を参照)を使ってます。
ひねくれているとか言わないでください。
# <assembly>System.Web.dll</assembly>の記述が必要です。

To: kiwa さん

> Windowsにログイン(ローカルアカウント)する際のアカウント、パスワードと一致しているかどうかの認証を意味しています。

申し訳ないのですが、私にはちょっとわかりません。
識者の方のフォローを期待しましょう。

個人的には、そういうことが仮にできてしまうと、パスワードクラックが
容易になってしまうので、できないんじゃないかとも思いますが。

# Win9xの*.pwlファイルは、たしか仕様が公開されたか
# 解析されたかしていたと思いますが…。


To: 魔界の仮面弁士 さん

> 》 管理人むたぐち さん 2004年 06月 14日 18時 42分 40秒
> > XMLHTTPでHTTPのステータスコード302を返されると固まる現象も報告済みなんでしょうかw
> この件ですが、どこか、現象を再現可能なURLは御存知ですか?

失礼しました、固まるのは、ステータスコード302が原因ではなく、
Location: がレスポンスヘッダーに指定されている場合です。
例としては「また」2ちゃんねるですが、例えばこのようなコードです。

sURL="http://pc5.2ch.net/hoge"
Set xh = CreateObject("MSXML2.XMLHTTP")
xh.Open "GET",sURL,False
xh.Send
MsgBox xh.responseText

# MSXML2.XMLHTTP.4.0というProgIDはうちでは登録されてませんでした。
# 別途インストールが必要なんですね。
# ので、確認はMSXML3です。


To: ocean さん

取り下げということのようですが、一応。

> WSHがクライアントとしてSTAなのかMTAなのか知りたく調べてみたのですが、

私には分からないですが、ちょっと前に議論があった気がします。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list101.shtml この辺ですね。

麻巳子S さん (jpc0859@jpcom.jp) 2004年 06月 18日 13時 45分 45秒

初投稿です。女の子が募集するとメールたくさん来るってホント??マミには来なかったりして;^_^A
メールから初めて夏にはステディな関係になれたらいいなo(^o^)o写メ交換OKデス。


ocean さん 2004年 06月 17日 23時 21分 10秒

この質問はとりさげます。失礼しました。

ocean さん 2004年 06月 17日 08時 00分 59秒

こんにちは。
WSHがクライアントとしてSTAなのかMTAなのか知りたく調べてみたのですが、
VisualBasic(STA)とASP.NET(MTA)の情報しか得られませんでした。
ご存知の方いらっしゃいませんか?よろしくお願いします。

魔界の仮面弁士 さん 2004年 06月 17日 02時 33分 47秒

》 管理人むたぐち さん 2004年 06月 14日 18時 42分 40秒
> XMLHTTPでHTTPのステータスコード302を返されると固まる現象も報告済みなんでしょうかw
この件ですが、どこか、現象を再現可能なURLは御存知ですか?

302を返すサーバの幾つかに対して、MSXML4にて XMLHTTP.send() して
みたのですが、今の所、固まってしまうという現象を再現できずにいます。

ばんのしゃーによかばんた さん 2004年 06月 16日 22時 03分 10秒

>管理人むたぐち さん 2004年 06月 14日 18時 42分 40秒
>現実的には、<script>タグをあらかじめ削除してテンポラリなファイルに
>書き出し、それを読み込む、ということになるでしょうけど、決して
>美しくはないですね。

どれだけ削除すれば、安全で、かつ警告が出ないようになるのか、がはっきりしなくて。
漏れていたとき、危険ですし。

例えば、<script>以外に<applet>、<object>、onなんとか=、href=javascript:
なども、危なそうです。

あと、ページが見つからないなどのエラーで出す内部のHTMLにもスクリプトがあって、
これと区別が付かない(ぷんぷん:-<)ので、この手のエラーも出ないようにしなくては。

<noscript>でcgiなどを呼び出してたり、
<iframe>で広告などを参照していたり、
これらは無条件で削除してよいものか、何か適当な条件を付けるべきか、とか。

などと考えると憂鬱です。

そもそも、HTMLにスクリプトなんて不要です。
どうせ、ブラウザの設定で無効にしているのだから、要らない機能の代表格です。
ぷんぷん:-<

ばんのしゃーによかばんた さん 2004年 06月 16日 22時 02分 18秒

>WSH初心者 さん 2004年 06月 04日 16時 49分 19秒
>”常時起動中にしてある(ロックがかかっている)サーバーのPCが何らかの理由で
>ログオフされたとき、もしくはログオフしようとしているとき、それをメールで知らせる” 
>といったものをVBSで・・・と考えているのですが

以下は参考になりませんか。

>ばんのしゃーによかばんた さん 2004年 05月 11日 20時 11分 19秒
>Excelを利用したlogoff procedureです。

これは動的にスクリプトをExcelに作り込む例ですが、
初めからExcelに作っておけばよいのでは。
標準モジュールを追加して、
Sub Auto_Open()
Application.Visible = False
End Sub
Sub Auto_Close()
' ここにメールを出す処理
End Sub

どうせメールを使うなら、ExpressでないExpensiveなOutlookだけで出来るかも。:-p

アクティブディレクトリのほうにログオフスクリプトとかいう機能もあるやに聞いたような。
よく知りません。
しかし、あまり、後の方で動くものは、使える機能が限られるのではないか、と思います。

いずれにせよ、自分で異常を知らせるという設計は信頼性が低いのでは。
一定周期で何らかのI'm alive信号を出して、それを他システムで監視する。
あるいは、他システムからAre you ready?という通信を出して、返事があればok。など。
自他を併用すれば、信頼性と速報性が両立します。監視周期も長めに緩められます。

ばんのしゃーによかばんた さん 2004年 06月 16日 13時 00分 48秒

>いりや さん 2004年 06月 14日 17時 24分 59秒
>ところで FD 3.13 は (C) A.Idei で Miel 2.58 は (C) A.Idei &
>Paci さん、のようですね。

ごめんなさい。> 出射 厚さん
同じ作者だと思い込んでいました。その点は合っていたのですが。

さて、改訂版です。

※むたぐちさんに教わったエクスプローラバー/フォルダを表示。
※OnQuitの中でWScript.Quitするとタイミングエラーが出やすいみたい。
なので、フラグにして、WScript.Quitはメインループへ。
※SelectedItemsは動作が変。IEのVersionによって全選択状態のまま。
FocusedItemに。意味を勘違いしていたかな。
※拡張子で選別。
※サイズが最初だけ(0からだと)ずれる。再調整。

Set fso=CreateObject("Scripting.FileSystemObject")
Folder=""
For Each arg In WScript.Arguments
Folder=arg
Exit For
Next
Folder=fso.GetAbsolutePathName(Folder)

Set window=WScript.CreateObject("InternetExplorer.Application","IE_")
window.Navigate Folder

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Top = 0
ie.Left = 0
ie.Width = 0
ie.Height = 0
ie.AddressBar = False
ie.MenuBar = False
ie.StatusBar = False
ie.ToolBar = False
ie.Resizable = False
ie.Document.body.scroll="no"
ie.document.body.leftMargin=0
ie.document.body.topMargin=0
ie.document.body.rightMargin=0
ie.document.body.bottomMargin=0
ie.Visible=True

Set img=ie.Document.CreateElement("img")
Call ie.document.body.insertadjacentelement("AfterBegin",img)
Set img.onload=GetRef("ViewPad")

'window.Top = 0
window.Left = ie.document.parentwindow.screen.availWidth/2
window.Width = ie.document.parentwindow.screen.availWidth/2
'window.Height = 0
window.ShowBrowserBar "{EFA24E64-B078-11D0-89E4-00C04FC9E26E}",True
window.Visible=True
Do
If OnQuit=0 Then
On Error Resume Next
path=window.Document.FocusedItem.Path
On Error GoTo 0
If path<>src Then
Select Case LCase(fso.GetExtensionName(path))
Case "gif","jpg","art","wmf"
src=path
img.src=src
End Select
End If
End If
WScript.Sleep 100
If OnQuit Then WScript.Quit
Loop

Sub ViewPad()
ie.document.Title=src
ie.Width = ie.Width + img.Width - ie.document.body.clientWidth
ie.Height = ie.Height + img.Height - ie.document.body.clientHeight
If img.Width <> ie.document.body.clientWidth Or _
img.Height <> ie.document.body.clientHeight Then
ie.Width = ie.Width + img.Width - ie.document.body.clientWidth
ie.Height = ie.Height + img.Height - ie.document.body.clientHeight
End If
End Sub

Sub IE_OnQuit()
OnQuit=True
End Sub

これで、だいぶ安定的に動くのではないかと思います。

これの主目的は実寸全体表示なんです。
縮小表示とか、プレビュー表示、とかをなんとかしたかったんです。

実は同様のものをVBで作っていたのですが、結局、完成しなくって。
表示までは作ったのですが、削除や移動を追加しようとして停まっていました。
VBScriotでエクスプローラをそのまま利用すると楽ですね。

魔界の仮面弁士 さん 2004年 06月 14日 19時 43分 55秒

》 管理人むたぐち さん
> XMLHTTPでHTTPのステータスコード302を返されると固まる現象も報告済みなんでしょうかw
そういう現象があるのですか? 把握してなかったです。
確認してみますね。

> あとresponseTextが文字化けするのも何とかしてほしいですよね。
RFC2045に従って、HTTPレスポンスヘッダのContent-Type で
指定された Charset に準じて判定してくれれば良いのでしょうが
(charset未指定時はus-ascii扱いで)、実際には MSXML3 と MSXML4 で
動作が違うんですよね…。
.responseBody と ADODB.Stream の組み合わせで対応するしか手は無いのかな。

kiwa さん 2004年 06月 14日 19時 16分 07秒

To:管理人むたぐちさん

>To: kiwa さん
>
>> 引数としてユーザ名とパスワードを受け取り、それに対してWindows2000の>認証を行い、OKかNGを判定するコードはどのように書けばよいのでしょうか?

>ここでいう「認証」とは何の認証のことでしょうか?

Windowsにログイン(ローカルアカウント)する際のアカウント、パスワードと一致しているかどうかの認証を意味しています。

管理人むたぐち さん 2004年 06月 14日 18時 42分 40秒

前ページの返信から。


To: ばんのしゃーによかばんた さん 2004年 06月 07日 22時 07分 21秒

> ローカルなHTMLファイルをインターネットゾーンか、またはスクリプトを無効にして、
> HTMLDocumentに取り出す方法はありませんか。

DHTMLEditコントロールで解決しているようですが、一応…。

最初に、WSHでローカルで動くWebサーバーを書いてそこにHTMLファイルを載せて…
とかアホな妄想をしてしまいました。

現実的には、<script>タグをあらかじめ削除してテンポラリなファイルに
書き出し、それを読み込む、ということになるでしょうけど、決して
美しくはないですね。

ただ、C:\Documents and Settings\username\Cookiesは「制限付きサイトゾーン」
ですし、任意のフォルダを制限付きサイトゾーンにする方法が分かれば、
道が見えてくるかもしれませんね。ぜんぜん外してるかもですが。

余談ですが、ファイル名を指定して実行でshell:cookiesとか便利ですよね〜。
shell:sendto、shell:system、shell:sendto、shell:favorites、shell:startup
なんかを良く使います。


To: Hiro さん 2004年 06月 09日 12時 33分 59秒

> URLを送信して、IEアプリでそのリンク先を開き(非表示でも良い)、そのViewSource HTMLソースを、指定するディレクトリに、指定する名前で、HTMLテキスト書類として作成する。最後に使用アプリを閉じて、終了。

IEだけで実現する方法はないわけではないです(InternetExplorer.Application、
outerHTMLなどをキーワードに掲示板を検索してください)が、元のソースを
完全には再現しないので、XMLHTTPとADODB.Streamの合わせ技がお勧めです。
やり方については、これまた掲示板をこれらの単語で調べてください。


ここからこのページの返信。


To: kiwa さん

> 引数としてユーザ名とパスワードを受け取り、それに対してWindows2000の認証を行い、OKかNGを判定するコードはどのように書けばよいのでしょうか?

ここでいう「認証」とは何の認証のことでしょうか?


To: 魔界の仮面弁士 さん

XMLHTTPでHTTPのステータスコード302を返されると固まる現象も報告済みなんでしょうかw
あとresponseTextが文字化けするのも何とかしてほしいですよね。
たまに文字化けしないサーバーもあるんですけど。2chとか。

管理人むたぐち さん 2004年 06月 14日 17時 50分 37秒

SelectionChangedは、WScript.ConnectObjectが使えない(どこかで
仕様だとかバグだとか聞いた気がします)ので、
多分どうしようもないでしょう。

このスクリプトって、Win2000/Meのイメージのプレビュー機能に似てますね。
フォルダのカスタマイズで、「イメージのプレビュー」テンプレートを
選ぶと出てくる奴です。ファイルを選択すると、ウィンドウのイメージも
同期します。

WinXPでも「フォルダの種類」を「フォトアルバム」にすると、似たような
ことができるんですが、フォルダウィンドウ内に表示するか、スライドショーで
全画面表示かの二択で、ウィンドウ表示ができないみたいなんですね。

XPではfolder.httがカスタマイズできませんので、どうにもなりません。
WSHで無理やり外部からアクセスするしかないわけですね。

余談ですが、Win2000用に作った、folder.htt(htt2000)の機能の一つに、
表示したフォルダの履歴をcookieに保存し、常時フォルダ内にリンク表示させる
というのがあったんですけど、これをXPでWSHを使って再現できないか
考え中だったりします。自分で言うのも何ですが、どうにもあの機能は捨てがたい…。

いりや さん 2004年 06月 14日 17時 24分 59秒

> その昔、DOSでMIELというのがあった。FDの清水 洋平(Paci)氏の作。

あ〜なつかしやなつかしや。久しぶりに XP 上で FD を起動してみ
ました。8 年も前のバイナリだけどちゃんと動きますよ。

ふと x (eXec) をタイプ。cscript.exe を入力して... おぉ、動く
動く。なんか不思議な気分、指が覚えている。。

ところで FD 3.13 は (C) A.Idei で Miel 2.58 は (C) A.Idei &
Paci さん、のようですね。

清水 洋平氏 http://www.vector.co.jp/vpack/browse/person/an000007.html
出射 厚氏 http://www.vector.co.jp/vpack/browse/person/an000006.html

管理人むたぐち さん 2004年 06月 14日 16時 58分 08秒

To: ばんのしゃーによかばんた さん

> ※エクスプローラバーのフォルダを出したいが、ShowBrowserBarの指定が不明。

window.ShowBrowserBar "{EFA24E64-B078-11D0-89E4-00C04FC9E26E}",True

とりあえずこれだけフォローです。

ばんのしゃーによかばんた さん 2004年 06月 14日 16時 22分 22秒

その昔、DOSでMIELというのがあった。FDの清水 洋平(Paci)氏の作。
上半分のファイル名一覧でのカーソルの移動に合わせて、
下半分のテキスト表示が移り変わって見える。
要らないものをマークして削除。ファイルのゴミ整理に有効だった。
Windowsでは、秀ゴミ、秀見え、というのがあった。秀丸の斉藤秀夫氏の作。
ただし、オープン/保存ダイアログのみ。

Windowsなのだから、これらと同じ操作性を画像ファイルで出来ないものか。
それもエクスプローラで。構想何年。やっと試作品ができました。

画像ファイルのフォルダを右に開き、選択された画像を左に表示し、
カーソルやマウスで選択を変えると、画像も切り替わります。
※フォルダを移動するときは、表示/エクスプローラバー/フォルダを出して移動。
※エクスプローラバーのフォルダを出したいが、ShowBrowserBarの指定が不明。
※フォルダか画像のウィンドウを閉じると終了する。
※監視ループでなく、イベントのSelectionChangedを使いたいが、遣り方が不明。

Set window=WScript.CreateObject("InternetExplorer.Application","IE_")
window.Navigate "c:\" 'フォルダを指定

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
: : WScript.Sleep 100
Loop
ie.Top = 0
ie.Left = 0
ie.Width = 0
ie.Height = 0
ie.AddressBar = False
ie.MenuBar = False
ie.StatusBar = False
ie.ToolBar = False
ie.Resizable = False
ie.Document.body.scroll="no"
ie.document.body.leftMargin=0
ie.document.body.topMargin=0
ie.document.body.rightMargin=0
ie.document.body.bottomMargin=0
ie.Visible=True

Set img=ie.Document.CreateElement("img")
Call ie.document.body.insertadjacentelement("AfterBegin",img)
Set img.onload=GetRef("ViewPad")

'window.Top = 0
window.Left = ie.document.parentwindow.screen.availWidth/2
window.Width = ie.document.parentwindow.screen.availWidth/2
'window.Height = ie.document.parentwindow.screen.availHeight
window.Visible=True
Set FolderItem=Nothing
Do
: : On Error Resume Next
: : Set FolderView=window.Document
: : If Err=0 Then
: : : : If FolderView.SelectedItems.Count>0 Then
: : : : : : If Err=0 Then
: : : : : : : : Set FolderItem2=FolderView.SelectedItems.Item(0)
: : : : : : : : If Err=0 Then
: : : : : : : : : : If Not (FolderItem2 Is FolderItem) Then
: : : : : : : : : : : : Set FolderItem=FolderItem2
: : : : : : : : : : : : img.src=FolderItem.Path
: : : : : : : : : : End If
: : : : : : : : End If
: : : : : : End If
: : : : End If
: : End If
: : WScript.Sleep 100
Loop

Sub ViewPad()
ie.document.Title=img.src
ie.Width = ie.Width + img.Width - ie.document.body.clientWidth
ie.Height = ie.Height + img.Height - ie.document.body.clientHeight
End Sub

Sub IE_OnQuit()
WScript.Quit
End Sub

魔界の仮面弁士 さん 2004年 06月 14日 16時 10分 17秒

先日、XMLHTTPオブジェクトの使用中に奇妙な現象に遭遇したので、
報告しておきます。MSXML4(SP2)を利用している方は注意してください。


[対象製品]
Microsoft XML Core Services (MSXML) 4.0 Service Pack 2

[概要]
XMLHTTP オブジェクトの setRequestHeader メソッドの第 2 引数に、
空白文字から始まる文字列を渡すと、リクエストヘッダの内容が
正しく送信されない可能性があります。

[再現手順]
1. 通信内容を捕捉するために、ネットワークモニタを起動します。
ネットワークモニタの使い方に付いては、下記を参照してください。
http://support.microsoft.com/default.aspx?scid=kb;ja;148942
http://support.microsoft.com/default.aspx?scid=kb;ja;295405

なお、ネットワーク モニタが使えない場合は、フリーソフトの
InetSpy 等を利用する事もできます。
http://hide.maruo.co.jp/software/inetspy.html

2. VBScript、Visual Basic、VBA等から、以下のコードを実行します。

Set X = CreateObject("MSXML2.XMLHTTP.4.0")

'Timer値を付加しているのは、キャッシュが使われるのを防ぐためです。
'ここではgoogleを指定していますが、localhostでも再現します。
X.Open "GET", "http://www.google.co.jp/?e=" & CStr(Timer), False

X.setRequestHeader "X-DATA-1", "200406"
'X.setRequestHeader "X-DATA-2", Str(1)
X.setRequestHeader "X-DATA-2", " 1"
X.setRequestHeader "X-DATA-3", "GET"

X.Send

3. ネットワーク モニタを使ってキャプチャした内容を確認します。


[結果]
下記のような情報が送信されます。

GET http://www.google.co.jp/?e=54176.67 HTTP/1.0
Accept: */*
X-DATA-1: 200406
X-DATA-2: 1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)
Host: www.google.co.jp
Proxy-Connection: Keep-Alive

最後に指定したはずの『X-DATA-3』フィールドが出力されていません。


[状況]
上記現象を Microsoft に問い合わせた所、以下の回答を頂きました。

・送信するヘッダデータの先頭にのみ 1 個以上の空白がある場合に、
 後続するヘッダが送信されないか、または、ヘッダの最後に改行文字が
 付加されず、後続のヘッダが一行に連なってしまうという現象を確認。
・2004/06/11 の時点で、この件に関する Knowledge Base は存在しない。
・この現象は、MSXML 4.0 SP2 の XMLHTTP のみで発生する不具合と断定。
・ServerXMLHTTP、および MSXML 4.0 SP1 以下では、この現象は発生しない。
・現段階では、この件に関する修正モジュールが提供されるかどうかは未定。


[対処方法]
案1) 先頭に空白が含まれるないように、コードを修正する。
→手間はかかりますが、現段階では有効な回避策と思われます。

案2) MSXML4 に SP2 を適用しない。
→コードの修正が不要なので手軽ですが、 SP1 以下のモジュールの提供は
 既に終了しているため、 [MS04-004] などの修正プログラムを適用する事が
 できなくなるなど、セキュリティ上の問題が残ります。

案3) ServerXMLHTTP で代用する。
→ ServerXMLHTTP と XMLHTTP は、機能は似ていますが、キャッシュの
 動作やSSLの扱いなどに、若干の違いがあります。
http://support.microsoft.com/default.aspx?scid=kb;ja;290761
http://support.microsoft.com/default.aspx?scid=kb;JA;289481

案4) MSXML 3.0 の XMLHTTP で代用する。
→ MSXML3 と MSXML4 は共存でき、MSXML3 では今回の現象は再現しません。
 しかし MSXML3 の setRequestHeader メソッドは、第 1 引数に指定した
 フィールド名が小文字に変換されて出力されるなど、動作の一部に
 違いがあるため、注意が必要です。


――以上、御報告までに。

kiwa さん 2004年 06月 14日 15時 00分 31秒

はじめまして、kiwaと申します。よろしくお願いします。

引数として与えられたアカウント、パスワードに対して、OS認証を行うにはどのように記述すればよいのでしょうか。

kiwa さん 2004年 06月 14日 14時 59分 51秒

はじめまして、kiwaと申します。

引数としてユーザ名とパスワードを受け取り、それに対してWindows2000の認証を行い、OKかNGを判定するコードはどのように書けばよいのでしょうか?

麻巳子S さん (jpc0859@jpcom.jp) 2004年 06月 14日 11時 36分 18秒

初投稿です。女の子が募集するとメールたくさん来るってホント??マミには来なかったりして;^_^A
メールから初めて夏にはステディな関係になれたらいいなo(^o^)o写メ交換OKデス。


放置機 さん 2004年 06月 13日 14時 07分 54秒

>ばんのしゃーによかばんた さん 2004年 06月 10日 22時 52分 14秒
>For Each file In folder.Files
>cnt = cnt +1
>Next
>でいかがでしょうか。

この方法で解決できました。ありがとうございました。
結局、WSHのバージョンによる差異ですね。

ばんのしゃーによかばんた さん 2004年 06月 12日 15時 04分 45秒

>ばんのしゃーによかばんた さん 2004年 06月 10日 21時 29分 30秒
>Set fso=CreateObject("Scripting.FileSystemObject")
>'Set document=getobject("res://" & fso.GetSpecialFolder(1).Path & >"\mshtml.dll/blank.htm","htmlfile")
>Set document=getobject("res://mshtml.dll/blank.htm","htmlfile")

IE5.0ではgetobject(〜,"htmlfile")でres://が使えないようなので、
Set document=getobject(WScript.ScriptFullName,"htmlfile")
が汎用に使えてよいかも。

あと、文字化けするときは、
>Set TDC=document.CreateElement("object")
>TDC.classid="CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83"
>Call document.body.insertadjacentelement("AfterBegin",TDC)
のあとに、
TDC.CharSet="shift_jis"
を入れてください。

因みに、
WScript.Echo document.body.parentElement.outerHTML
を入れて、どういうHTMLが出来ているのかを見ると参考になります。
この手は、オブジェクトのプロパティや省略値を調べるとき、使えそうです。

いりや さん 2004年 06月 11日 05時 49分 40秒

UIUI さん、

小鳥遊 水樹さんの「ゆなデュプリケート」が参考になるでしょう。

http://www.uryusoft.com/menuext/

いりや さん 2004年 06月 11日 05時 39分 40秒

魔界の仮面弁士さん、

MVP の件、ありがとうございます。光栄です。
さきほどアドレスをお送りしました。

魔界の仮面弁士 さん 2004年 06月 11日 02時 53分 52秒

》 ばんのしゃーによかばんた さん
> このページの以下の怪しげなタグは何でしょうか。
それらの文字列は、ASP.NETで利用される「VIEWSTATE」と呼ばれるものです。
http://www.knowlbo.co.jp/technology/dotNetMagazine/dotNetMag1/dotNetMag1-11.htm
http://www.atmarkit.co.jp/fdotnet/dotnettips/041viewstate/viewstate.html


ところで。先のMVP(Microsoft Most Valuable Professional)の件ですが、如何でしょう。
MVP候補としての推薦をお受けになられるつもりはありませんか?

もし、MVPプログラムへの推薦を受けても良いかな、と思われましたら、
次回(10月頃)のノミネーションに向けて、推薦に向けての御案内をさせて頂きたく
思いますので、よろしければ、
 『 oratorio アットマーク s2.ocv.ne.jp 』
のメールアドレスまで御連絡頂けないでしょうか。
(普段お使いのアドレスを公表したくなければ、フリーメール等でも構いませんので…)

次回の審査時期まではまだ随分ありますので、ちょっと気が早すぎるとも思いますが、
ギリギリになってから連絡するのも何なので、今のうちからお誘いしている次第です。

なお推薦後は、MS(国内および米国)の担当の方々が、掲示板等での活動状況をみて、
MVPに相応しいかどうかの審査を行います。それゆえ、推薦をお受けいただいたとしても、
その審査結果次第ではMVPを受賞できない事もありますが、その時は御了承下さい。


# ちなみにMVPのノミネーションや再ノミネーションは、現在、年に2回ほど提供されており、
# 今の時期は、ちょうどその審査のタイミングだったりします。そのため本来は、
# 今回の審査に間に合うよう、何名かの方々をMVP候補として推薦したかったのですが
# いりやさんとばんのしゃーによかばんたさんは、連絡先が分からなかったので、
# 残念ながら、今回(先月中旬)のノミネーション候補者に含める事ができませんでした。。。

ばんのしゃーによかばんた さん 2004年 06月 10日 22時 53分 05秒

>魔界の仮面弁士 さん 2004年 06月 09日 17時 21分 22秒
>なお、MVPとは以下のような制度です。
>http://www.hollytown.net/public/mvp/

このページの以下の怪しげなタグは何でしょうか。なんか気持ち悪いんですが。

<form name="_ctl0" method="post" action="Default.aspx" id="_ctl0">

<input type="hidden" name="__VIEWSTATE" value="dDwtMTIyODk3MDAzODt0PDtsPGk8MT47P
jtsPHQ8O2w8aTwzPjtpPDU+Oz47bDx0PHA8bDxWaXNpYmxlOz47bDxvPGY+Oz4+O2w8aTwxPjs+O2w8d
Dx0PHA8cDxsPERhdGFWYWx1ZUZpZWxkO0RhdGFUZXh0RmllbGQ7PjtsPHNpdGU7c2l0ZTs+Pjs+O3Q8a

以下、延々と100Kバイトほど続く。


ばんのしゃーによかばんた さん 2004年 06月 10日 22時 52分 14秒

>放置機 さん 2004年 06月 04日 00時 52分 08秒
>VBSでファイルを扱いたいのですが
>WSH1.0ではFiles.Countでコレクションの数を取得できないのでしょうか。

Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("C:")
cnt=0
For Each file In folder.Files
cnt = cnt +1
Next
Msgbox cnt

でいかがでしょうか。

ばんのしゃーによかばんた さん 2004年 06月 10日 21時 29分 30秒

ちょっと古いですが、

>管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 11月 28日 00時 29分 24秒
># Tabular Data Control (TDC)もWSHから呼び出す方法がわかれば、ソート
># に使えるんですけどねえ。TDC自体はIE4以上に付属しているのでシステム標準機能ですし。

と、むたぐちさんが何度も仰っていたので、一度TDCを使ってみなくてはと思っていました。
やっとこさ、こんなものが出来ました。

※Versionによってres://がfullpathでないと駄目なときはコメントと替える。
※Versionによってhtmlfileが使えないときは乙案へ。
※データのサンプルはAYAさんのところのものを拝借しました。
(Document Object Model 10. Data Binding)

甲案 htmfileを使用。

Set fso=CreateObject("Scripting.FileSystemObject")
'Set document=getobject("res://" & fso.GetSpecialFolder(1).Path & "\mshtml.dll/blank.htm","htmlfile")
Set document=getobject("res://mshtml.dll/blank.htm","htmlfile")
Do While document.readyState<>"complete"
WScript.Sleep 100
Loop
Set TDC=document.CreateElement("object")
TDC.classid="CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83"
Call document.body.insertadjacentelement("AfterBegin",TDC)
TDC.DataURL=fso.GetAbsolutePathName("score.csv")
TDC.UseHeader="true"
Set RS=TDC.recordset
Set Fields=RS.Fields
WScript.Echo Fields.Count
dim a()
redim a(Fields.Count-1)
For i=0 To Fields.Count-1
a(i)=Fields(i).Name
Next
WScript.Echo Join(a)
Do Until RS.EOF
For i=0 To Fields.Count-1
a(i)=Fields(i).Value
Next
WScript.Echo Join(a)
RS.moveNext
Loop
TDC.sort="国語"
TDC.reset
RS.moveFirst
For i=0 To Fields.Count-1
a(i)=Fields(i).Name
Next
WScript.Echo Join(a)
Do Until RS.EOF
For i=0 To Fields.Count-1
a(i)=Fields(i).Value
Next
WScript.Echo Join(a)
RS.moveNext
Loop

乙案 IEを使用。

Set fso=CreateObject("Scripting.FileSystemObject")
Set ie=CreateObject("InternetExplorer.Application")
'ie.Navigate "about:blank"
ie.Navigate "res://mshtml.dll/blank.htm"
'ie.Navigate "res://" & fso.GetSpecialFolder(1).Path & "\mshtml.dll/blank.htm"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
'ie.Visible=True
Set TDC=ie.Document.CreateElement("object")
TDC.classid="CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83"
Call ie.document.body.insertadjacentelement("AfterBegin",TDC)
TDC.DataURL=fso.GetAbsolutePathName("score.csv")
TDC.UseHeader="true"
Set RS=TDC.recordset
Set Fields=RS.Fields
WScript.Echo Fields.Count
dim a()
redim a(Fields.Count-1)
For i=0 To Fields.Count-1
a(i)=Fields(i).Name
Next
WScript.Echo Join(a)
Do Until RS.EOF
For i=0 To Fields.Count-1
a(i)=Fields(i).Value
Next
WScript.Echo Join(a)
RS.moveNext
Loop
TDC.sort="国語"
TDC.reset
RS.moveFirst
For i=0 To Fields.Count-1
a(i)=Fields(i).Name
Next
WScript.Echo Join(a)
Do Until RS.EOF
For i=0 To Fields.Count-1
a(i)=Fields(i).Value
Next
WScript.Echo Join(a)
RS.moveNext
Loop
ie.Quit

これらを見ると、なぜWSH直にTDCが使えないのか、分かります。
Set RS=TDC.recordset
このrecordsetはTDCのメンバではなく、HTMLObjectElementの非表示メンバです。
つまり、TDC直にはrecordsetが取り出せない。
HTMLObjectElementにくるんでやると取り出せる。
これに代わる方法があればWSH直に使えるのでしょうが、それがあるかどうかは不明。

さて、こうしてやってはみたものの、こうまでしてTDCを使う価値はありましょうや。
これだったら、直接ADOのrecordsetを使ったほうが、セキュリティレベルなんかを
気にしなくて済むので、よさそう。

>土屋 さん 2001年 08月 18日 11時 06分 37秒
>(斬鉄剣を使ったあとの五右衛門の心境だなあ。「またつまらないものを作ってしまった」)
と同じ心境です。

ばんのしゃーによかばんた さん 2004年 06月 10日 21時 28分 31秒

>魔界の仮面弁士 さん 2004年 06月 09日 17時 21分 22秒
>> dhtmled.LoadDocument fso.GetAbsolutePathName("a.htm")
>> Set Document=dhtmled.DOM
>ばんのしゃーによかばんたさんのコードを、私の環境で実験したみたところ、
>上記の部分で、0x8000FFFF の実行時エラーが発生してしまいました。

これは、これは、原因調査までして頂き恐縮です。
私のところでは簡単なhtmlファイルで動作確認していたので、エラーが起きなかった
ようです。どうも済みません。

Do While dhtmled.busy
WScript.Sleep 100
Loop

をLoadDocumentの後に入れればよいようです。

亜紀 さん (jpc0003@jpcom.jp) 2004年 06月 10日 17時 58分 40秒

24歳の人妻です。主人とは深刻な倦怠期で会話もないし
半年間セックスレス…ストレス溜まりまくりです。
こんな私を精神的にも肉体的にも満たしてくれませんか?
誠実で優しい方を希望します。割り切りOK!秘密厳守で
お願いします。

UIUI さん 2004年 06月 10日 16時 11分 41秒

はじめまして、UIUIです。これからよろしくお願いします。
VBSで次の事をしたいのですが、私のスクリプトではうまくいきません。
ちなみに、このスクリプトはレジストリをいじってIEでリンく上にて右クリックしたときのメニューから動作するようにしたいです。
@まず、選択されているリンクのURLをc:\link.txtに書く。
A次に、現在表示しているページのURLをc:\url.txtに書く。
B自作プログラム(c:\IELINK.EXE)を起動

1と3はできるのですが2ができません
----------------ここからスクリプト++--------------
<SCRIPT LANGUAGE="VBScript">
Dim ws, fo, tf
Dim SelText, Doc
Set ws = CreateObject("WScript.Shell")
Set fo = CreateObject("Scripting.FileSystemObject")
Set tf = fo.CreateTextFile("c:\url.txt")
SelText = external.menuArguments.event.srcElement.tagName().text
tf.WriteLine( SelText )
tf.Close
Set tf = fo.CreateTextFile("c:\link.txt")
SelText = external.menuArguments.event.srcElement().text
tf.WriteLine( SelText )
tf.Close
ws.Run CHR(34) & "c:\IELINK.EXE" & CHR(34)
</SCRIPT>
----------------------ここまで----------------------------------
どうしたら現在表示しているページのアドレスをテキストファイルに
保存できるのでしょうか?
よろしくお願いします。

kenji さん 2004年 06月 10日 14時 31分 17秒

ばんのしゃーによかばんたさん、

お勧め通りWSHのヘルプとScriptControlのヘルプもダウンロードして
該当個所を読んでみたらタイムアウトの件は理解できました。ありが
とうございました。今後活用して行きます。

オブジェクト・ブラウザーは分かり難いですね。元々VBAの知識が極
めて薄いのでマイクロソフトのスクリプト言語の全体像が今ひとつ掴め
ていないせいでしょう。

いりや さん 2004年 06月 10日 00時 40分 00秒

Hiro さん、

| URLを送信して、IEアプリでそのリンク先を開き(非表示でも良い)、そのViewSource
| HTMLソースを、指定するディレクトリに、指定する名前で、HTMLテキスト書類として作
| 成する。最後に使用アプリを閉じて、終了。

うららさんの

・YahooTV番組表取込スクリプト ver1.4a
・CyberSyndrome Proxy List 取込スクリプト

は Hiro さんの課題のお手本としておすすめします。WSH/JScript でこさえれたスクリ
プトです。

http://www.geocities.co.jp/SiliconValley-PaloAlto/9030/

ただし さん 2004年 06月 09日 18時 40分 24秒

kimiok さん

それは良かったですね。私もこのフォーラムで以前大変お世話になりま
した。何かご恩返しが出来たらといつも願ってるのですが力量が伴って
ないからROMばかりです。このフォーラムのレベルは凄く高いが基本的な
事でも親身になって教えて頂けるし何がしかのアドバイスが得られるの
で好きですよ。今回少しでもお役に立てて幸いです。

魔界の仮面弁士 さん 2004年 06月 09日 17時 21分 22秒

》 ばんのしゃーによかばんた さん
> documentElement.outerHTMLは変わるのですが、
> DocumentHTMLとSaveDocumentは変わらないので、
加工前の状態(IEでいえば、右クリックのソースの表示状態)を取得するのか、
加工後の状態(HTMLDocumentオブジェクトを操作した後の結果)を
取得するのかによっても使うべきメソッド/プロパティが異なりますね。

また、取得方法によっては、結果の一部(METAタグのGENERATORの有無など)が
変化することもありましたので、どの方法で取得するのかを、
考慮する必要があるかも知れません。


>>> ローカルなHTMLファイルをインターネットゾーンか、またはスクリプトを無効にして、
>>> HTMLDocumentに取り出す方法はありませんか。
>>こちらはわかりませんでした。。。
> これは、「DHTMLEditコントロール」のLoadDocumentですね。
LoadDocumentメソッドは、実行ホストによっては使えないようです。
WSFの<object>要素で宣言した時や、new ActiveXObject/CreateObjectで
生成したときは、LoadDocumentメソッドが実行時エラーを返しました。

そこで、私はVB6を使ってDHTMLEditをテストしていたのですが、こちらは
LoadDocumentは使えたものの、スクリプトが無効にならなかったのです。
そのため、てっきりDHTMLEditでも駄目なのだと思い込んでしまっていました。。。

そこで、もう一度自分のコードを確認してみたのですが、ようやく原因がわかりました。
私は、BrowseModeプロパティをTrueにして使っていたので、それがまずかったようです。
Falseにした場合は、スクリプトが実行されることもありませんでした。

(確かに、DOMの操作だけなら、Falseのままで十分ですよね……うっかりしていました)


> dhtmled.LoadDocument fso.GetAbsolutePathName("a.htm")
> Set Document=dhtmled.DOM
ばんのしゃーによかばんたさんのコードを、私の環境で実験したみたところ、
上記の部分で、0x8000FFFF の実行時エラーが発生してしまいました。

そこで、DHTML Editing SDK付属のヘルプファイル(SDK_Help.chm)で確認したところ、
下記のような記述を見つけました。このあたりに原因がありそうです。

| The DocumentComplete event is fired when the control is first instantiated.
| Thereafter, the event is fired when the control has finished running or
| setting any of the following:
|
| ・LoadDocument method
| ・LoadURL method
| ・NewDocument method
| ・BaseURL property
| ・BrowseMode property
| ・DocumentHTML property
|
| Certain properties, such as DocumentHTML and DOM, are not valid until this
| event has been fired. If you attempt to access these properties before the
| event has fired, a DE_E_UNEXPECTED error occurs.


>>  Dim F As IPersistFile
> は何を参照設定すればよいのでしょうか。
標準では、IPersistFile用のタイプライブラリは用意されていないため、私は、
VB6付属のMKTYPLIB.EXEを使って自作したTLBファイルを参照設定しました。
http://www.ocv.ne.jp/~oratorio/windev/vb/TypeLibrary/_CreateShortcut.cab


ただ、このあたりのインターフェイス用のタイプライブラリは、
Visual Basic の『Microsoft MVP』でもある Eduardo A. Morcilloさんも
公開されていますので、私の稚拙なタイプライブラリを使うより、
Eduardoさんが公開されている物を使った方が良いかも知れません。(^^;
http://www.mvps.org/emorcillo/


ところで。

話は変わりますが、この「Microsoft MVP」の次年度のノミネーション作業が、
数ヵ月後(10月頃?)に行われる予定になっています。

そこで、そのタイミングに合わせて、この掲示板の常連さんであられる、
ばんのしゃーによかばんたさんといりやさんを、Scripting分野のMVPとして、
マイクロソフトに推薦したいと考えているのですが、如何でしょうか?

なお、MVPとは以下のような制度です。
http://mvp.support.microsoft.com/default.aspx
http://www.hollytown.net/public/mvp/

kimiok さん 2004年 06月 09日 16時 31分 48秒

ただしさん

アドバイスをいただきありがとうございます。

>VBScriptとPerlのサンプルコードは次のURLを当って見て下さい。
>邦訳はまだ出ていないようです。
>http://www.rallenhome.com/books/adcookbook/code.html

原因は DN において、ou=Users としていものを、cn=Users へ変更することで解決できました。ありがとうございます。
やはり初歩的な問題でした。。。

ばんのしゃーによかばんた さん 2004年 06月 09日 14時 20分 57秒

>魔界の仮面弁士 さん 2004年 06月 08日 11時 26分 50秒
>「DHTMLEditコントロール」を使って見たところ、
>  strHTML = DHTMLEdit1.DOM.documentElement.outerHTML
>のように、HTMLDocument経由で取得する替わりに、
>  strHTML = DHTMLEdit1.DocumentHTML
>のようにして受け取ることが出来ました。実行ホストはHTAです。

すばらしい。

「DHTMLEditコントロール」は、
>管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 02月 09日 17時 23分 16秒
>DHTML Editなるコントロールを発見。(IE5に付属)
>これがまた、すさまじく高機能なのです。
>Frontpage Expressと同様の、HTMLエディタを提供するコントロールです。
>適当にインターフェースをつけていけば、本格的なHTMLエディタが作れそうです。
>CLASSIDは、2D360200-FFF5-11D1-8D03-00A0C959BC0Aです。
で聞いていたので、試してみたのですが、
Document.Title="bbbb"
とすると、
documentElement.outerHTMLは変わるのですが、
DocumentHTMLとSaveDocumentは変わらないので、IEと同じで駄目、
と早合点していました。

魔界の仮面弁士 さんの話を聞いて、もう一度試してみました。
Document.body.innerText="CCC"
とすると、
DocumentHTMLとSaveDocumentも変わりました。

>> ローカルなHTMLファイルをインターネットゾーンか、またはスクリプトを無効にして、
>> HTMLDocumentに取り出す方法はありませんか。
>こちらはわかりませんでした。。。

これは、「DHTMLEditコントロール」のLoadDocumentですね。

ということで、VBScript+IE+DHTMLEditです。

Set fso=CreateObject("Scripting.FileSystemObject")
Set ie=CreateObject("InternetExplorer.Application")
'ie.Navigate "about:blank"
'ie.Navigate "res://mshtml.dll/blank.htm"
ie.Navigate "res://" & fso.GetSpecialFolder(1).Path & "\mshtml.dll/blank.htm"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
'ie.Visible=True
Set dhtmled=ie.Document.CreateElement("object")
dhtmled.classid="CLSID:2D360200-FFF5-11D1-8D03-00A0C959BC0A"
call ie.document.body.insertadjacentelement("AfterBegin",dhtmled)
dhtmled.LoadDocument fso.GetAbsolutePathName("a.htm")
Set Document=dhtmled.DOM
Document.Title="bbbb"
Document.body.innerText="CCC"
Wscript.Echo dhtmled.DocumentTitle
Wscript.Echo dhtmled.DocumentHTML
Wscript.Echo Document.body.ParentElement.outerHTML
dhtmled.SaveDocument fso.GetAbsolutePathName("o.htm")
ie.Quit
Wscript.Quit

"bbbb"はouterHTMLだけ変わり、saveされない。
"CCC"は両方変わり、saveもされました。

DHTMLEditのほうの警告は出ますが、
"a.htm"のスクリプトは無効になっているようで動きませんでした。

これは結構使えるのではないでしょうか。

魔界の仮面弁士 さん、ありがとう。

ところで、
>また、HTAではなく、Visual Basicを利用した場合には、
>  DHTMLEdit1.SaveDocument "C:\foo.html", False
>のように、SaveDocumentメソッドを使って保存したり、あるいは、
>  Dim F As IPersistFile
>  Set F = DHTMLEdit1.DOM
>  F.Save "C:\foo.html", True
>のように、IPersistFile(もしくはIPersistStreamInit)を使って、
>ファイルに保存させる事も出来ました。

をVBAで試してみましたが、
>  Dim F As IPersistFile
は何を参照設定すればよいのでしょうか。

Return