ばんのしゃーによかばんた さん 2004年 08月 01日 18時 51分 55秒

修正。

>ばんのしゃーによかばんた さん 2004年 07月 28日 17時 51分 19秒
>ie.navigate "view-source:〜"などは出来ないようです。

ie.document.parentwindow.navigate "view-source:http://〜
のほうは出来たんですね。
――――――――――――――――――――――――――――――――――――――
Set ie=CreateObject("InternetExplorer.Application")
ie.Visible=True
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.document.parentwindow.navigate "view-source:http://〜/〜.htm"
Do While ie.Visible
WScript.Sleep 100
Loop

いりや さん 2004年 08月 01日 14時 27分 09秒

くだんの Finalization がらみで WSH/JScript のガベジコレクションの内部実
装を調べていたのですが、msdn library 以外にもけっこう米国 Microsoft 社の
社員の方がいろいろと情報を公開されていることを知りましたのでいくつかリン
ク情報をご紹介します。

1. comp.lang.javascript

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&group=comp.lang.javascript

2. MSDN Newsgroups : scripting.javascript

http://msdn.microsoft.com/newsgroups/topic.aspx?url=/msdn-files/028/201/013/topic.xml

から選ぶか

http://msdn.microsoft.com/newsgroups/default.aspx?dg=microsoft.public.scripting.jscript&lang=en&cr=US


このあたりです。

私が調べていた InternertExplorer で Dynamic HTML Object Model を扱うとき
にメモリリークを起こしうるコーディング [*] について登場した Steve van
Dongen [MSFT] さんは常連さんのようです。その他 F.A.Q. をメンテナンスして
いる Richard Cornford さんや以前 JSMON などで紹介したことのある Douglas
Crockford さんも登場しています。

開発チームのスタッフと話すことができる場が設けられているのはいいことです
ね。

注釈

http://www.jibbering.com/faq/faq_notes/closures.html#clMem

http://groups.google.com/groups?selm=bf3covselun1940chajrg52eo5ibcvek9b%404ax.com
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=bcq6fn%24g53%241%248300dec7%40news.demon.co.uk&rnum=1&prev=/groups%3Fhl%3Den%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26q%3Dmemory%2Bleak%2Bie

ばんのしゃーによかばんた さん 2004年 07月 31日 17時 05分 50秒

修正です。

>ばんのしゃーによかばんた さん 2004年 07月 28日 17時 51分 19秒
>これだけだと、NotePadが開きますので、view-sourceの設定を変更します。
>IE6ではTweakUIで変更できるそうです。レジストリキーは不明。
>IE5.5などでは文字列"notepad"に固定なようです。(本当?)

IE5.0/5.5などでも、レジストリで変更できるようです。
――――――――――――――――――――――――――――――――――――――
REGEDIT4
[HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\View Source Editor]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\View Source Editor\Editor Name]
@="d:\\vbs\\hogehoge.vbs"
――――――――――――――――――――――――――――――――――――――

hogehoge.VBSの例。保存先をプロンプトします。自動化するときは変更。
――――――――――――――――――――――――――――――――――――――
Dim args()
ReDim args(WScript.Arguments.Count-1)
For k=0 To WScript.Arguments.Count-1
args(k)=WScript.Arguments(k)
Next
arg=Join(args)
Set fso=CreateObject("Scripting.FileSystemObject")
Set Shell=CreateObject("Shell.Application")
Set folder=Shell.BrowseForFolder(0,arg,1)
If Not (folder Is Nothing) Then
If typename(folder)="Folder" Then
If folder.Items.Item Is Nothing Then
tofolder=fso.GetParentFolderName(folder.Items.Item(".").Path)
Else
tofolder=folder.Items.Item.Path
End If
Else
tofolder=folder.Self.Path
End If
If Right(tofolder,1)<>"\" Then tofolder=tofolder & "\"
' MsgBox arg & vbcrlf & tofolder
fso.CopyFile arg,tofolder
Else
Set wShell=CreateObject("WScript.Shell")
' If WScript.Arguments.Count>1 Then arg="""" & arg & """"
wShell.Run "Notepad.Exe " & arg
End If
――――――――――――――――――――――――――――――――――――――

あんのうん さん 2004年 07月 31日 14時 12分 39秒

HTAでスクリーンセーバを作ってみました。
Wikiにアップロードさせてもらいましたのでよろしければいぢってみてください。
(.NET Frameworkが必要+IE6推奨、簡単なサンプルと少し凝ったサンプルに分け
てみました)

他の開発環境でスクリーンセーバを作るとなるとちょっと怯んでしまうんですが、
要は、

 ・シングルインスタンスであること
 ・OSから送られる引数を処理できること
 ・マウスやキーボードのイベントを拾って終了できること

さえ満たせればいいので、HTAでもできるのではないかと思ったのがきっかけ
です。はじめは暇つぶし程度でしたが、考えるのが結構楽しいのでここ数日ハマ
ってしまいました。

もっかの課題は、今のところ、HTAを直接キックすることが出来なかった為、
EXEベースの起動用プログラム(*.SCR)が必要になる為、これを克服できないかと
いうことです。
(レジストリいじったり色々試してみたんですが、、)

以下、HTAの一例です。スクリーンセーバとしては働きませんが、これ単体でも
動くと思います。
------------------------------以下------------------------------
<html>
<head>
<HTA:APPLICATION
applicationName="反射1"
id="moHTA"
maximizeButton=no
border=none
innerborder=no
showintaskbar=no
Scroll=no
singleinstance=yes
windowstate=maximize
>
<title></title>
<script language="vbscript">
Option Explicit
Dim miX,miY
Sub MouseMove()
If miX <> 0 And miY <> 0 Then
If Abs(miX - Window.Event.ClientX) > 10 Or _
Abs(miY - Window.Event.ClientY) > 10 Then
Window.Close
End If
End If
miX = Window.Event.ClientX
miY = Window.Event.ClientY
End sub
Sub KeyPress()
Window.Close
End sub
Sub Init()
Window.resizeTo 0,0
If Instr(LCase(moHTA.Commandline)," /p") > 0 Or _
Instr(LCase(moHTA.Commandline)," /a") Then
Window.Close
End If
If Instr(LCase(moHTA.Commandline)," /c") > 0 Then
Msgbox "この機能は現在使用できません"
Window.Close
End If
Window.ResizeTo Screen.Width,Screen.Height
End sub
Dim miVX,miVY
Sub Start()
With moResult.Style
.PixelTop = .PixelTop + miVY
.PixelLeft = .PixelLeft + miVX
If .PixelTop <= 0 Then miVY = 1
If .PixelTop + 5 >= Document.Body.ClientHeight Then miVY = -1
If .PixelLeft <= 0 Then miVX = 1
If .PixelLeft + 5 >= Document.Body.ClientWidth Then miVX = -1
End With
End Sub
</script>
</head>
<body bgcolor="black" onload="Init():setInterval 'Start()',10" onmousemove="MouseMove()" onkeypress="KeyPress()" style="cursor:url(transparent.cur)">
<img id="moResult" style="position:absolute;top:0;left:0;Width:5;Height:5;;border-style:solid;border-width:1px;border-color:black;background-color:white">
</body>
</html>


美沙 さん (jpk6511@jpcom.jp) 2004年 07月 30日 18時 52分 00秒

今まで付き合った彼氏って全員ノーマルだったから変わったHに興味あり♪
特にオモチャに一番興味あるんだよねぇ〜☆☆友達が最高に気持ちいいって言うから私も経験してみたいの〜!
でも、一人で買いに行くのは(/▽\)ハズイ・・・一緒に行かない?(笑)
そのオモチャで責められたいなぁ(#^.^#)いっぱい気持ちいい事して遊ぼうよぉ♪♪

tetsu さん 2004年 07月 30日 16時 58分 48秒

Windows2000 SP3 VB6.0の環境で
CDO(Collaboration Data Objects)を使ったメール自動送信プログラムを作成しています。
LAN接続により、STMPサーバーに接続する場合はメール送信できるのですが、
ダイヤルアップ接続でメール送信しようとすると、自動ダイアルアップ接続されないため、メールが送信されません。
何か原因があるのでしょうか?
もしくは、ダイアルアップ接続のプログラムが必要となるのでしょうか?
簡単に解決する方法がないかご回答お願いします。

以下はテストプログラムです。

Private Sub Command1_Click()
Dim cdoMessage As CDO.Message        
Dim cdoConfig As CDO.Configuration

Set cdoMessage = New CDO.Message   'Massageオブジェクト生成
Set cdoConfig = New CDO.Configuration   'Configurationオブジェクト生成

With cdoConfig.Fields
.Item(cdoSendUsingMethod) = cdoSendUsingPort 'メール送信にSMTPを使用
.Item(cdoSMTPServer) = "SMTPサーバー名" 'SMTPサーバー名をセット
.Update 'Configurationオブジェクトに反映
End With

With cdoMessage
Set .Configuration = cdoConfig 'Configurationオブジェクトをセット

  'メール送信に必要な情報をセット
.From = "送信者アドレス"      
.To = "相手先アドレス"
.Subject = "件名"
.TextBody = "メール本文"

.Send '送信
End With

Set cdoConfig = Nothing               'オブジェクト解放
Set cdoMessage = Nothing
End Sub


ばんのしゃーによかばんた さん 2004年 07月 28日 17時 51分 19秒

view-source:〜を使って、VBScriptからWebページを保存する方法。

ie.navigate "view-source:〜"などは出来ないようです。
SendKeys "%(vc)"するしか、方法はないかなぁ、と思っていましたが、
href=〜に指定できるようです。
――――――――――――――――――――――――――――――――――――――
Set ie=CreateObject("InternetExplorer.Application")
ie.Visible=True
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.document.write "<a id=v href='view-source:http://〜'>v</a>"
ie.document.all.v.click
Do While ie.Visible
WScript.Sleep 100
Loop
――――――――――――――――――――――――――――――――――――――
これだけだと、NotePadが開きますので、view-sourceの設定を変更します。
IE6ではTweakUIで変更できるそうです。レジストリキーは不明。

IE5.5などでは文字列"notepad"に固定なようです。(本当?)
そこで、PATHの順序でNotepad.exeより先にnotepad.VBSなどが見つかるようにすれば
よいのです

ただし、2000/XPでは先頭のSystem32にNotepad.exeが鎮座し、かつ、
SFPが変更を許さないので、ちょっと手がありません。

Win98などではNotepad.exeはWindowsにあるので、SystemにNotepad.LNKを置けばよい。
*.VBSは検索されないのですが、間に*.LNKを挟めばよいようです。

notepad.VBSの例。保存先をプロンプトします。自動化するときは変更。
――――――――――――――――――――――――――――――――――――――
Dim args()
ReDim args(WScript.Arguments.Count-1)
For k=0 To WScript.Arguments.Count-1
args(k)=WScript.Arguments(k)
Next
arg=Join(args)
Set fso=CreateObject("Scripting.FileSystemObject")
Set Shell=CreateObject("Shell.Application")
If WScript.Arguments.Count>1 Then arg="""" & arg & """"
Set folder=Shell.BrowseForFolder(0,arg,1)
If Not (folder Is Nothing) Then
If typename(folder)="Folder" Then
tofolder=fso.GetParentFolderName(folder.Items.Item(".").Path)
Else
tofolder=folder.Self.Path
End If
If Right(tofolder,1)<>"\" Then tofolder=tofolder & "\"
fso.CopyFile arg,tofolder
Else
Set wShell=CreateObject("WScript.Shell")
wShell.Run "Notepad.Exe " & arg
End If
――――――――――――――――――――――――――――――――――――――

まき さん (jpc2254@jpcom.jp) 2004年 07月 28日 14時 54分 40秒

普段と違う自分になっちゃいたいんですけど、付き合ってくれる人いませんか?
今まで大人しく生きてきたから…
私は27歳で語学学校の教師をしています。
身長は160aで痩せ方です!

ちゃきちゃっき〜 さん 2004年 07月 28日 10時 16分 57秒

はじめまして。VBscriptに挑戦中なのですが、壁に突き当たって悩んでます。。。
良いアイディアがありましたらぜひご教授いただけると助かります。宜しくお願いします!

VBSでIEを起動,URL表示,アクティブウィンドウキャプチャ後、次のURLへという巡回+キャプチャスクリプトを作成していますが、その際にポップアップウィンドウが邪魔になります。
そこで考えたのが以下の方法です。

IE起動、Setting、URL表示、Wait

IEwindow確認処理
IEが起動しているかを確認
起動IEがあればToolBarが表示されているかをチェック
Toolbarが表示されていないIEがあれば終了処理

IEウィンドウが0でなかったらキャプチャ処理を行い、IEを終了

なのですが、vbs起動時にIEが起動していないと
行:16
エラー:起動されたオブジェクトはクライアントから切断されました
コード:80010108
ソース:(null)
のエラーで落ちる場合があります。
(落ちる場所が異なったりメッセージが異なったりする場合あり)
vbs起動時に既にIEが起動していれば問題なく動作します。

抜粋スクリプトは以下の通りなのですが、何かお気づきの点がありましたらご指摘お願いします。
(スクリプト内のdummy.txtは巡回対象URLが1行毎に記載されたtxtファイルです)
また、これ以外にポップアップウィンドウの上手い制御方法があればアドバイスをいただけると大変嬉しいです。宜しくお願いします!

Option Explicit

Dim objShell,objWindow,oIE2
Dim objFileSys,oIE,objText
Dim actURL,lstURL,IEcnt,I2

Set objShell = CreateObject("Shell.Application")
Set objFileSys = CreateObject("Scripting.fileSystemObject")

Set objText = objFileSys.OpenTextFile("dummy.txt",1)
lstURL = ""

Do While NOT objText.AtEndOfStream
actURL = objText.ReadLine

Set oIE = CreateObject("InternetExplorer.Application")
oIE.Visible = True
oIE.Navigate actURL

WScript.Sleep 1000
Do Until oIE.busy = 0
WScript.Sleep 500
Loop
Do Until oIE.readyState = 4
WScript.Sleep 500
Loop

IEcnt = 0
For Each objWindow In objShell.Windows
'-- HTMLDocumentだったらIEオブジェクトに設定
If TypeName(objWindow.document) = "HTMLDocument" Then
Set oIE2 = objWindow
IEcnt = IEcnt + 1
'-- ToolbarがFalse だったらPopUpウィンドウとする
'-- IEcntを減らして、ウィンドウを閉じる
If oIE2.Toolbar = false Then
oIE2.Quit()
IEcnt = IEcnt - 1
End If
Set oIE2 = Nothing
End If
Next
If IEcnt <> 0 Then
oIE.Quit()
Set oIE = Nothing
end if
Loop
Set objText = Nothing
Set objFileSys = Nothing

おしゃる さん 2004年 07月 26日 22時 57分 51秒

To:管理人むたぐちさん
>WinXPでMMC20.Applicationを使って、サービスを停止する方法です。
>ちゃんとダイアログが表示されます。

ありがとうございます。MMC2.0のリファレンスをいろいろ調べていたんですが、撃沈しそうになっていたところでした。
ありがとうございました。

魔界の仮面弁士 さん 2004年 07月 26日 16時 48分 02秒

》 管理人むたぐち さん
> To: ぽろん さん
>> Windows95、98、Meのマシンに既に設定されているIPアドレスやDFG、DNS、Winsの設定をWSHから書き換える方法でなにかよいSampleをご存知の方、いらっしゃらないでしょうか。

確認していませんが、レジストリの書き替えで対応できるかもしれません。
http://www.ksunet.co.jp/win98/bootip.html

ただし9x系の場合、ネットワークの設定後は、必ずOSの再起動が必要になると思います。
(2000等は、必ずしも再起動しなくても済みますけれど)

> WinNT系だとWMIやnetshなどで比較的簡単にできるんですが、
> Win9x系はどうでしたっけ。
NETSHコマンドは、9Xでは使えません。(確か、Win2000からの実装だったかと)
また、WMIは、95/98等には標準ではサポートされていないので、別途インストールが必要となりますね。

管理人むたぐち さん 2004年 07月 26日 16時 01分 08秒

To: Perlすくりぷたー さん

> VBSやJSだとVBEやJEに暗号化できるみたいですが、Perlのコードを同様に暗号化することは出来ないでしょうか?

おそらくScript EncoderはPerlScriptには対応していないので
無理なんじゃないでしょうか。

Perlならバイナリ(というか実行形式)化する方法があるみたいです。
まずCのコードに変換してからCコンパイラを動かすとか
そういう仕組みだったかもしれません。
あとWindowsにもあるかどうかは調べていません。


To: ぽろん さん

> Windows95、98、Meのマシンに既に設定されているIPアドレスやDFG、DNS、Winsの設定をWSHから書き換える方法でなにかよいSampleをご存知の方、いらっしゃらないでしょうか。

WinNT系だとWMIやnetshなどで比較的簡単にできるんですが、
Win9x系はどうでしたっけ。
随分長い間触っていないもので、忘れかけています。
どなたか補足をお願いします。

# あとでVirtual PC 2004にWin98を入れてみよう…。メモリ足りるかな。

管理人むたぐち さん 2004年 07月 26日 15時 28分 18秒

WinXPでMMC20.Applicationを使って、サービスを停止する方法です。
ちゃんとダイアログが表示されます。

Set MMC = WScript.CreateObject("MMC20.Application")
MMC.Load "services.msc"
'MMC.Show
Set Doc = MMC.Document
Set View = Doc.Views.Item(1)

For Each Node In View.ListItems
If Node.Name="Task Scheduler" Then 'タスクスケジューラ
View.Select Node
View.ExecuteSelectionMenuItem "Stop"
Exit For
End If
Next

ExecuteSelectionMenuItemメソッドの引数に渡すMenuItemPathは、
次のようなコードで調べられます。
サービスの場合は、Start、Stop、Pause、Resumeなどがあることが分かります。

'↑のView.Select Nodeという行の後に追加
For Each menuitem In View.SelectionContextMenu
s=s & menuitem.LanguageIndependentPath & vbCrLf
Next
msgbox s

他、詳しくはオブジェクトブラウザでMicrosoft Management Control 2.0
を参照してください。

ぽろん さん 2004年 07月 26日 10時 00分 43秒

Windows95、98、Meのマシンに既に設定されているIPアドレスやDFG、DNS、Winsの設定をWSHから書き換える方法でなにかよいSampleをご存知の方、いらっしゃらないでしょうか。
宜しくお願い致します。

ばんのしゃーによかばんた さん 2004年 07月 25日 16時 59分 46秒

コード系の絡みで、

>魔界の仮面弁士 さん 2004年 07月 06日 22時 19分 06秒
>》 ふみふみ さん
>> ts.WriteLine "<meta http-equiv=content-type content=text/html; charset=unicode>"
>> ではなくて、
>> ts.WriteLine "<meta http-equiv=content-type content=text/html; charset=shift_jis>"
>> のほうが良いのでしょうか…。
>HTMLの仕様から言えば、前者は指定できない事になっています。
>「Unicode」ではなく、「UTF-16」等であれば認められていますけれども。

IEの、名前を付けて保存、でunicodeを選ぶと、
<META http-equiv=Content-Type content="text/html; charset=unicode">
と書き出すようです。

ただ、unicode(UTF-16)やUTF-7の場合は、ASCII文字もエンコードされるので、
HTTPでやりとりする分には問題なくても、HTMLファイルの場合は、
charset=を読み取るためには、その前にcharset=を知らねばならぬ、という鶏が先か、
卵が先か状態に陥ってしまいます。
IEでは、unicodeの場合、ByteOrderMarkがあればOK。ないと駄目です。
UTF-7の場合、Set-O(エンコードするか/直接埋め込みか選択可能な)文字まで
エンコードするケースでは駄目。Set-O文字をエンコードしないケースではOKでした。
ただし、そういうコード変換は標準的な環境にはないようです。↑は自作VBScriptです。

>ふみふみ さん 2004年 07月 13日 20時 04分 31秒
>とりあえず現時点では、Unicode で出力された HTML を、新規に Shit-JISで開いたEditor で copy
>& paste して保存するようにしております。
>atmarkit の記事を参考にもしたのですが、多数のファイルを扱うような状況ではないので、手作業
>でも対応できる状態でもあります。

???

ですから、最初から、言ってますように、

>ばんのしゃーによかばんた さん 2004年 07月 04日 23時 54分 44秒
>単純にHTMLファイルをUnicodeで出力してやれば解決するのではありますまいか。
>Set ts=fso.CreateTextFile(strPath,True,True)
>ですね。
>Unicodeは嫌だ、ShiftJISがいいという向きには以下。

この二つの選択肢の中から、SJISの方を選べばよいのですが。。。

Perlすくりぷたー さん 2004年 07月 25日 15時 47分 07秒

はじめまして。PerlでWSHのコードを書いてる者です。

VBSやJSだとVBEやJEに暗号化できるみたいですが、Perlのコードを同様に暗号化することは出来ないでしょうか?

どなたかご存知でしたら教えてください。


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

続いてこのページ。

To: Petit-Charat さん

> 非常に些細なことですが、貴サイトの解説部分に、その辺の
> 注釈の追加など考慮して頂ければ、
> 以降、同部分を参照する方にも有益なものと考えます。

ご指摘ありがとうございます。訂正を加えておきました。
あの文書は、まだ知識が少なかったかなり以前に書いたもので、
内容もずいぶん古くなっています。
なので、この手の突っ込みどころはおそらく山ほどあると
思いますが、全面改稿に踏み切る気力もなく、何となく放置して
しまっているのが現状です。このあたりをうまくWikiに移行させるのが
当初の目論見だったんですが、なかなか難しいです。
気合で乗り切るにゅ(謎)



To: おしゃる さん

> 通常通りServiceを停止させるときみたいにステータスバーを表示させることってできるんでしょうか?

魔界の仮面弁士さんの提示された方法以外にも、WMIを使う方法があります。

参考:
- サービスを一時停止する [Win32_Service] -
http://wmifun.atinfinity.net/wmisample/win32_serviced.html

ここに載っているコードはVBのコードなので、VBSに直すとこんな感じです。

Set Locator = createobject( "WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer
Set SerSet = Service.ExecQuery("Select * From Win32_Service Where Name='Schedule'")
For Each Ser In SerSet
Ret = Ser.PauseService()
Next
If Ret = 0 Then
MsgBox "サービスの一時停止に成功しました。"
Else
MsgBox "サービスの一時停止に失敗しました。"
End If

ただし、この方法でもステータスバーは表示されないので、別の方法を考える
必要がありますね。

未調査ですが、MMC20.Applicationを使えば何とかなるかもしれません。
参考:
MSDN Magazine & Microsoft News
http://www.ascii.co.jp/pb/msdn/article/a13_0015.html

管理人むたぐち さん 2004年 07月 25日 15時 16分 01秒

前ページの返信から。

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

> url2htm.vbs

お二人が改良された分をマージして再アップロードしました。
ほとんどお二人のコードだけで私のオリジナルの原型はありませんが、
最後にちょっとだけ手を入れておきました。


To: 魔界の仮面弁士 さん

> > ts.WriteLine "<meta http-equiv=content-type content=text/html; charset=unicode>"
> > ではなくて、
> > ts.WriteLine "<meta http-equiv=content-type content=text/html; charset=shift_jis>"
> > のほうが良いのでしょうか…。
>
> HTMLの仕様から言えば、前者は指定できない事になっています。
> 「Unicode」ではなく、「UTF-16」等であれば認められていますけれども。

今回のurl2htm.vbsでは、meta要素をそもそも記述しないことにしました。
Unicode(UTF-16)だと、ブラウザがエンコード形式を間違える可能性は
皆無のはずなので…。


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

> Scriptプロパティを使わなくても、
> SelectionChangedがShellFolderViewOC経由でConnect出来ました。
> この場合、WebViewにしなくても接続できます。
> 2000で確認。98は死にます。XP未確認。

これXPでもちゃんと動作しました。
ShellFolderViewOCってこうやって使うんですね。

魔界の仮面弁士 さん 2004年 07月 25日 09時 57分 02秒

》 ばんのしゃーによかばんた さん
> VB6を買う代わりにMSDNのレベルなんとかを買えば、
MSDN Subscriptionを単体で購入する、という手もありますが、
MSDN付きのVisual Studio製品を購入する、という選択肢もあります。
どちらにしても、それなりのコストは必要になってしまいますね。

# もしくは、MVP認定を受けて、MSDNを無料でもらうとか(汗)


> それに入っているか、ダウンロードできる、という意味でしょうか。
以前は、MSDN の Archive Library サービスとして、旧製品のメディアも
入手できたのですが、現在は、旧製品はダウンロードのみで提供されています。

具体的には、下記のサイトとなります。
http://www.microsoft.com/japan/msdn/subscriptions/resources/subdwnld.aspx

ここから、数多くのMicrosoft製品を、(MSDN会員であれば)無料で入手できます。
VB6に関しては、各国語版が用意されていますし(英/日/仏/独/西/中(繁)/中(簡)/伊/韓)、
VB2とかVB3とかVB4のように、さらに古い製品も入手できます。

また、古い製品だけではなく、Visual Studio 2003 や 同2005のような、
新しい製品に関してもダウンロードできるようになっています。


> ところで、VB6が(orで)なくても、使えるようです。
Visual InterDev などにも、*.SRG が含まれていると思います。


>> うーん、ランタイムライブラリがあっても、開発製品のライセンスがないと、
>> VBScriptからは使えないし。
> これは、本当ですよね。前提が間違っていたりして。
その前提は正しいと思います。(―――「使う」という言葉の範囲にもよりますけど)

市販されているコントロールの多くは、HKEY_CLASSES_ROOT\Licenses\ に、
適切なライセンス文字列が登録されていないと、使えないようになっています。

ただ、これは開発時に限った話ですので、厳密に言えば、それを
実行できるかどうかとは、別の問題であるとも言えます。

たとえばWebページなどで使われる場合、VB や ActiveX SDK などに含まれている
「LPK_TOOL.EXE」というツールにて作成された「LPKファイル」さえWebサイト上に
配置されていれば、ActiveXコントロールを実行させる事が可能です。
また、VB等のEXE内で使われている場合にも、実行に開発ライセンスは不要です。

# ――もちろん、LPKファイルを作成したり、VBのEXEを作ったりするためには、
# 開発時ライセンスが必要とされますけれどね。


> VB.NETが入っているので、そのためでしょうか。
HKCR\Licenses\ED4B87C4-9F76-11d1-8BF7-0000F8754DA1 に、適切な
ライセンス文字列が登録済みであれば、"Windows Common Controls 6.0"系の
コントロールを使った開発が行えると思います。

なお、VB.NETに関してはわかりませんが、VS.NET では「VB6Controls.reg」という
ファイルにて、これらのライセンス情報が提供されています。
http://support.microsoft.com/default.aspx?scid=kb;ja;318597

ばんのしゃーによかばんた さん 2004年 07月 24日 17時 03分 56秒

>魔界の仮面弁士 さん 2004年 07月 22日 23時 17分 17秒
>Subscriber Downloadsから、VB6自体をダウンロードする事になりますね。

うーん、
VB6を買う代わりにMSDNのレベルなんとかを買えば、それに入っているか、
ダウンロードできる、という意味でしょうか。

ところで、VB6が(orで)なくても、使えるようです。

>ばんのしゃーによかばんた さん 2004年 07月 22日 22時 11分 17秒
>うーん、ランタイムライブラリがあっても、開発製品のライセンスがないと、
>VBScriptからは使えないし。

これは、本当ですよね。前提が間違っていたりして。

>COMCTL32.OCXなら、VB5CCEをDownloadすればよいのでしょうが、
>MSCOMCTL.OCXの場合は、VB6はもう売ってないので、買えとも言えないし、
>どうすりゃよいのでしょう。VB.NETには入っているのでしょうか?

ToClip.HTAはXP機でも動きました。
VB.NETが入っているので、そのためでしょうか。
少なくとも、VB6が必須ということはないようです。

また、VB6評価版(=VB6LearningEdition-α)というのがあります。
使用期限なし、インストール数無制限、です。
これをランタイムライブラリ代わりに入れると、開発ライセンスも付いていて、よさそう。
VB6評価版は、日経BPパソコンベストムック のんびりゆっくりVisualBasic 1800円
2000年8月1日発行、などについていて、比較的入手しやすいのではないでしょうか。
VB.NETの2万円と比べてオーダが1桁違う。VB5CCEより、こっちがお勧めかな。

ばんのしゃーによかばんた さん 2004年 07月 24日 17時 03分 04秒

>魔界の仮面弁士 さん 2004年 07月 23日 00時 02分 48秒
>> 端末によるのは、インストールされている言語が違うから。とか。
>あら。MSXML4って、各国語版もあったのですか?

そういうことでなく、
コード系の自動判定はインストールされている言語の集合に依存する、
という意味だったのですが、

>>>(MSXML4のバージョンによっては、化けない端末もあります)
>なお、「化けない端末」のバージョンは、MSXML4(SP無し)でした。(1台)
>「化ける端末」の方は、すべてMSXML4/SP2です。(8台)

ということだったのですね。
私は、(MSXML4のバージョンによっては、化けない端末もあります)のところを
MSXML4の特定のバージョンでは、化ける端末と化けない端末がある、
と誤解してました。

>> 逆に、化けないサイトはJIS(7ビット)なのかな。
>そういえば、iso-2022-jp で試した事がありませんでした。
>時間が出来たときに、サーバ側の設定をかえて実験してみます。

UTF-7はどうでしょう?
もし、それがOKなら、

>当方では、XMLHTTPを「データを検索し、その結果をPlain Textで返す社内サイト」との
>通信に使っていたのですが、中国語の文字等も扱わなければいけなかったので、
>データ自体は UTF-8 で構成されていたのです。

UTF-7にすれば、

>で、今までは、
>「サーバ側からUTF-8なPlain Textを送り、responseBodyで受信し、Streamで変換」
>という流れで処理していたのですが、今回は、Shift_JIS な処理系をはさむ必要も
>出てきたので、バイナリで処理するより、URIエンコードの方が都合が良かったのです。
>(URIエンコードしてしまえば、任意の文字セットでUTF-8データを送れますからね)

エンコード/デコード処理は不要になります。
IEでcharset=utf-7は、選択肢に出てこないのですが、表示は出来ます。
保存はUTF-8かUTF-16になりそうですが。

魔界の仮面弁士 さん 2004年 07月 23日 00時 02分 48秒

》 ばんのしゃーによかばんたさん
> 端末によるのは、インストールされている言語が違うから。とか。
あら。MSXML4って、各国語版もあったのですか?
ニュートラルなのだと思っていました……日本語版を探してみます。


>>(MSXML4のバージョンによっては、化けない端末もあります)
なお、「化けない端末」のバージョンは、MSXML4(SP無し)でした。(1台)
「化ける端末」の方は、すべてMSXML4/SP2です。(8台)


> 逆に、化けないサイトはJIS(7ビット)なのかな。
そういえば、iso-2022-jp で試した事がありませんでした。
時間が出来たときに、サーバ側の設定をかえて実験してみます。


> 一般的には、バイト操作ですね。
ですよね。(^^;)
うちの場合は、かなり特殊なケースだったと思います。

当方では、XMLHTTPを「データを検索し、その結果をPlain Textで返す社内サイト」との
通信に使っていたのですが、中国語の文字等も扱わなければいけなかったので、
データ自体は UTF-8 で構成されていたのです。

で、今までは、
「サーバ側からUTF-8なPlain Textを送り、responseBodyで受信し、Streamで変換」
という流れで処理していたのですが、今回は、Shift_JIS な処理系をはさむ必要も
出てきたので、バイナリで処理するより、URIエンコードの方が都合が良かったのです。
(URIエンコードしてしまえば、任意の文字セットでUTF-8データを送れますからね)

おしゃる さん 2004年 07月 22日 23時 22分 07秒

みなさんこんにちは
以前にServiceを停止させるScriptでカキコしたものですが、
魔界の仮面弁士さんに教わった方法で見事に停止してくれるのですが、
通常通りServiceを停止させるときみたいにステータスバーを表示させることってできるんでしょうか?

質問ばかりで申し訳ありません。
宜しくお願いします。

魔界の仮面弁士 さん 2004年 07月 22日 23時 17分 17秒

》 ばんのしゃーによかばんた さん
> MSCOMCTL.OCXの場合は、VB6はもう売ってないので、買えとも言えないし、
> どうすりゃよいのでしょう。VB.NETには入っているのでしょうか?
Subscriber Downloadsから、VB6自体をダウンロードする事になりますね。

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

>魔界の仮面弁士 さん 2004年 07月 21日 21時 33分 55秒
>対象のサイトは、UTF-8 サイトと、Shift_JISサイトでした。
>MSXML3では化けません…が、MSXML4(SP2)は化けるようです。
>(MSXML4のバージョンによっては、化けない端末もあります)

SJISも化けるのですか。
自動判定で誤判定するという、この前のurl2htmの話と同じでしょうかねぇ。
端末によるのは、インストールされている言語が違うから。とか。
98では、ベトナム語が入ってないので日本語に判定されたが、
2000では、ベトナム語に判定された。みたいに。
逆に、化けないサイトはJIS(7ビット)なのかな。

>今回はSJIS/UTF-8なので、バイト操作で対処する事もできたのですが、
>私の時は、サーバ側も自社製プロジェクトでしたので、
>サーバ側: encodeURIComponent()を使い、データを変換して出力
>クライアント: decodeURIComponent()を使い、それを復元
>という方法で対処しました。

一般的には、バイト操作ですね。
以下にUTF-8、SJIS、EUC(半角カタカナ含む)を用意してみました。
――――――――――――――――――――――――――――――――――――――
Function UTF8toSJIS(buf)
Dim code
Dim code1
Dim code2
Dim code3
Dim k,sjis

For k=1 To LenB(buf)
code=AscB(MidB(buf,k,1))
If 0<=code And code<128 Then
sjis=sjis & Chr(code)
ElseIf 128+64<=code And code<128+64+32 Then
code1=code
k=k+1
code2=AscB(MidB(buf,k,1))
code=(code1 And &H1F) * 64 + (code2 And &H3F)
If Chr(Asc(ChrW(code)))=ChrW(code) Then
sjis=sjis & ChrW(code)
Else
sjis=sjis & "%" & Right(Hex(code1+256),2) & "%" & Right(Hex(code2+256),2)
End If
ElseIf 128+64+32<=code And code<128+64+32+16 Then
code1=code
k=k+1
code2=AscB(MidB(buf,k,1))
k=k+1
code3=AscB(MidB(buf,k,1))
code=(code1 And &H0F) * 16 * 256 + (code2 And &H3F) * 64 + (code3 And &H3F)
If Chr(Asc(ChrW(code)))=ChrW(code) Then
sjis=sjis & ChrW(code)
Else
sjis=sjis & "%" & Right(Hex(code1+256),2) & "%" & Right(Hex(code2+256),2) & "%" & Right(Hex(code3+256),2)
End If
Else
sjis=sjis & "%" & Right(Hex(code+256),2)
End If
Next
UTF8toSJIS=sjis
End Function
――――――――――――――――――――――――――――――――――――――
Function sjis2ucs(sjis)
Dim code,k,ucs

For k=1 To LenB(sjis)
code=AscB(MidB(sjis,k,1))
If code<&H80 Then
ucs=ucs & Chr(code)
ElseIf code>=&HA0 And code<&HE0 Then
ucs=ucs & Chr(code)
Else
k=k+1
code=code * 256 + AscB(MidB(sjis,k,1))
ucs=ucs & Chr(code)
End If
Next
sjis2ucs=ucs
End Function
――――――――――――――――――――――――――――――――――――――
Function euc2sjis(euc)
Dim code,code1,code2
Dim k,sjis

For k=1 To LenB(euc)
code=AscB(MidB(euc,k,1))
If code<128 Then
sjis=sjis & Chr(code)
ElseIf code=&H8E Then
k=k+1
code=AscB(MidB(euc,k,1))
sjis=sjis & Chr(code)
Else
code1=code
k=k+1
code2=AscB(MidB(euc,k,1))
code=jis2sjis((code1 And &H7F) * 256 + (code2 And &H7F))
sjis=sjis & Chr(code)
End If
Next
euc2sjis=sjis
End Function

Function jis2sjis(jis)
Dim sjis,a,b

a=jis \ 256
b=jis mod 256
If 33<=a And a<= 94 Then
If a mod 2 Then
If 33<=b And b<= 95 Then
sjis=a*128+b+28831
ElseIf 96<=b And b<=126 Then
sjis=a*128+b+28832
Else
sjis=0
End if
Else
If 33<=b And b<=126 Then
sjis=a*128+b+28798
Else
sjis=0
End If
End If
ElseIf 95<=a And a<=126 Then
If a mod 2 Then
If 33<=b And b<= 95 Then
sjis=a*128+b+45215
ElseIf 96<=b And b<=126 Then
sjis=a*128+b+45216
Else
sjis=0
End If
ElseIf 33<=b And b<=126 Then
sjis=a*128+b+45182
Else
sjis=0
End If
Else
sjis=0
End If
jis2sjis=sjis
End Function
――――――――――――――――――――――――――――――――――――――

ばんのしゃーによかばんた さん 2004年 07月 22日 22時 11分 17秒

>魔界の仮面弁士 さん 2004年 07月 21日 21時 22分 42秒
>それぞれ、Visual Basic 5.0, 6.0 に付属のコントロールですね。
># 正確には、VB以外の製品(VID等)にも含まれていますけれどね。OSとかにも。

うーん、ランタイムライブラリがあっても、開発製品のライセンスがないと、
VBScriptからは使えないし。
COMCTL32.OCXなら、VB5CCEをDownloadすればよいのでしょうが、
MSCOMCTL.OCXの場合は、VB6はもう売ってないので、買えとも言えないし、
どうすりゃよいのでしょう。VB.NETには入っているのでしょうか?

MSCOMCTL.OCXを利用したHTAは、昔、VB6を買った人だけが使える。。。:-(

ところが、Excel VBAの場合、ライセンスチェックはデザイン時に済みになるので、
コモンコントロールをフォームに貼り付けたXLSファイルは、他に持って行っても、
ExcelとVBランタイムライブラリがあれば使えます。
これをVBScriptから操作すれば、間接的にコモンコントロールも使えます。
うーん、面倒な。:-(

Petit-Charat さん (petit-charat@sky.zero.ad.jp) 2004年 07月 22日 13時 05分 08秒

はじめまして

ごく最近からVBA&VBS(アプリケーション依存型のみ)から
WSH(単独動作処理)に移行したばかりで、
貴サイトの情報は、大変参考になり、助かっております。

欲しい内容すぐに見つかり、早速利用させていただきました。
その1つに、使用して判った問題点があり、
誤植の類ではないと思いましたので報告いたします。

> 2.Shellオブジェクトを使う

> Const filename="C:\Windows\tips.txt"
> Set Win = WScript.CreateObject("Shell.Application")
> Win.NameSpace(filename).ParentFolder.ParseName(Win.NameSpace
> (filename).Title).InvokeVerb "印刷(&P)" 'tips.txtを印刷
> 'Win.NameSpace("c:\progra~1").Items.Item.InvokeVerb "検索(&F)..."
> 'Win.NameSpace("c:\Recycled").Items.Item.InvokeVerb "ごみ箱を空にす
> る(&B)"

を ゴミ箱を空にする

Set Win = WScript.CreateObject("Shell.Application")
Win.NameSpace("c:\Recycled").Items.Item.InvokeVerb "ごみ箱を空にする(&B)"

に限定して使用したところ

ゴミ箱関連のレジストリ情報に問題を抱えている、
当方の端末では動作しませんでした。

それ以前に W2K と WinXP のフォルダ名の違いも厄介で、

それぞれ

'W2K
'Win.NameSpace("c:\Recycled").Items.Item.InvokeVerb "ごみ箱を空にする(&B)"

'WinXP
'Win.NameSpace("c:\Recycler").Items.Item.InvokeVerb "ごみ箱を空にする(&B)"

のように 変更が必要でした。

しかし、前述の通りレジストリの状態に問題がある場合は、
****
レジストリ改変系ツールを利用して
特定の変更をしている場合、
同様の状態の可能性は高いかと...
****
それでも動作しなかった為、
以下のようにして コト無きを得ました。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
'RecyclerCleaner
Set Win = WScript.CreateObject("Shell.Application")
Win.NameSpace(10).Items.Item.InvokeVerb "ごみ箱を空にする(&B)"
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Win.NameSpaceの値に

ShellSpecialFolderConstants
Const ssfBITBUCKET = 10 (ごみ箱)

を 代入しただけの単純な違いですが、
これで問題なく動作を確認できました。
非常に些細なことですが、貴サイトの解説部分に、その辺の
注釈の追加など考慮して頂ければ、
以降、同部分を参照する方にも有益なものと考えます。

魔界の仮面弁士 さん 2004年 07月 22日 02時 30分 31秒

自己レス:

》魔界の仮面弁士
> サーバ側のCharset応答を変えても化けるようですので、

念のために補足しておきますと、この場合の Charsetというのは、HTMLの
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
に書かれる値では無く、HTTP応答ヘッダで示される値の事です。

/chaset指定に関する現状認識/
http://www.asahi-net.or.jp/~jy3k-sm/i_net/charset.html

いりや さん 2004年 07月 21日 23時 09分 47秒

エルさん、魔界の仮面弁士さん、

こんばんわ。

トレーニングで終日ネットから離れていましたが、解決されたよう
ですね。おめでとうございます !

エルさん、

// 自動で行いたいのは1時間おきくらいに売り上げデータのようなも
// のを自動でダウンロードして処理したいからです。(できたらバッ
// クグラウンドで)現行のシステムそのままでなるべく手をかけずに
// ということで WSH を検討しています。顧客端末に vbs ファイルを
// おき、それをタスクスケジュールで1時間おきに動かす、というよ
// うなことを目指しています。

なるほど、現行のシステムは手をさわらずに、という制約があった
んですね。PHP のソースを表示いただいていたので、サーバ・サイ
ドの方式検討の真っ最中なのかと思っていました。

魔界の仮面弁士 さん 2004年 07月 21日 21時 33分 55秒

》 ばんのしゃーによかばんたさん
> 文字コードは大抵、EUCかSJISではありませんか?
対象のサイトは、UTF-8 サイトと、Shift_JISサイトでした。
MSXML3では化けません…が、MSXML4(SP2)は化けるようです。
(MSXML4のバージョンによっては、化けない端末もあります)

サーバ側のCharset応答を変えても化けるようですので、
このMSXML4の XMLHTTP.resoponseText の件については、
Microsoftの担当の方に確認してみようと考えています。


> もし、そうで、それがEUCのときに化ける。というのであれば
ありがとうございます。

今回はSJIS/UTF-8なので、バイト操作で対処する事もできたのですが、
私の時は、サーバ側も自社製プロジェクトでしたので、

サーバ側: encodeURIComponent()を使い、データを変換して出力
クライアント: decodeURIComponent()を使い、それを復元

という方法で対処しました。

魔界の仮面弁士 さん 2004年 07月 21日 21時 22分 42秒

》 ばんのしゃーによかばんたさん
> どうも、Common Controlが2系統あるようですが、どういうことでしょう?
それぞれ、Visual Basic 5.0, 6.0 に付属のコントロールですね。
# 正確には、VB以外の製品(VID等)にも含まれていますけれどね。OSとかにも。

Common Controlsは、4.0→5.0の時は、単なるバージョンアップだったのですが、
5.0→6.0では、機能拡張部分が多かっため、互換性維持の目的のため、
別コンポーネントとして作成されたという事情があります。
(ファイルもCLSIDも別になっているため、6.0版と5.0版を同時に使う事が可能です)


> 因みに、上の例では前者を使っています。後者を使うと
> Data.files.Count
> で、何故かエラーになります。
6.0の方は、
 MsgBox TypeName(Data)    'IVBDataObject
 MsgBox TypeName(Data.Files) 'IVBDataObjectFiles
と返されました。一方、5.0 では、
 MsgBox TypeName(Data)    'IVBDataObject
 MsgBox TypeName(Data.Files) 'IVBDataObject
となりました。う〜む、なんだか奇妙な型を返してきますね。

もしかしたら、HTML(今回はHTAですが)上での動作は、考慮されていないのかも知れません。

ばんのしゃーによかばんた さん 2004年 07月 21日 20時 33分 55秒

>魔界の仮面弁士 さん 2004年 07月 19日 23時 40分 49秒
> # 当方では、XMLHTTP.responseText が文字コード判定に失敗して化けるという
> # 問題を、「.responseBodyをStreamで変換する」という手法で回避していたので、
> # このパッチ修正により、既存プログラムの修正を余儀なくされてしまいました。(^_^;)

文字コードは大抵、EUCかSJISではありませんか?
もし、そうで、それがEUCのときに化ける。というのであれば、
responseBodyをInStrBでcharset=の指定を見て、EUCなら、
responseBodyを強引にコード変換するというのはどうでしょうか。
これならStreamを使わなくて済みます。

Function euc2sjis(euc)
Dim code,code1,code2
Dim k,sjis

For k=1 To LenB(euc)
code=AscB(MidB(euc,k,1))
If code<128 Then
sjis=sjis & Chr(code)
Else
code1=code
k=k+1
code2=AscB(MidB(euc,k,1))
code=jis2sjis((code1 And &H7F) * 256 + (code2 And &H7F))
sjis=sjis & Chr(code)
End If
Next
euc2sjis=sjis
End Function

Function jis2sjis(jis)
Dim sjis,a,b

a=jis \ 256
b=jis mod 256
If 33<=a And a<= 94 Then
If a mod 2 Then
If 33<=b And b<= 95 Then
sjis=a*128+b+28831
ElseIf 96<=b And b<=126 Then
sjis=a*128+b+28832
Else
sjis=0
End if
Else
If 33<=b And b<=126 Then
sjis=a*128+b+28798
Else
sjis=0
End If
End If
ElseIf 95<=a And a<=126 Then
If a mod 2 Then
If 33<=b And b<= 95 Then
sjis=a*128+b+45215
ElseIf 96<=b And b<=126 Then
sjis=a*128+b+45216
Else
sjis=0
End If
ElseIf 33<=b And b<=126 Then
sjis=a*128+b+45182
Else
sjis=0
End If
Else
sjis=0
End If
jis2sjis=sjis
End Function

※半角カタカナには対応していませんが、希望があれば追加します。

エル さん 2004年 07月 21日 19時 51分 43秒

>魔界の仮面弁士 さん

ようやく解決しました。大変ありがとうございました。

ばんのしゃーによかばんた さん 2004年 07月 21日 13時 13分 27秒

ファイル(複数可)を、アイコンでなく、ウィンドウにドロップすると、
フルパス名のリストをクリップボードに入れるHTAです。

ToClip.HTA
――――――――――――――――――――――――――――――――――――――
<html>
<head>
<script language="vbscript">
window.ResizeTo 100,100
window.MoveTo window.screen.availWidth-100-11,0
</script>
<HTA:APPLICATION
applicationName="ToClip"
version=1.00
scroll=no
>
<title>ToClip</title>
<script language=vbscript>
Sub StatusBar1_OLEDragDrop(Data, Effect, Button, Shift, x, y)
For i = 1 To Data.files.Count
file=Data.files.Item(i)
If InStr(file," ") Then
files=files & """" & file & """" & vbCRLF
Else
files=files & file & vbCRLF
End If
Next
window.clipboarddata.setdata "text",files
End Sub
</script>
</head>
<body topmargin=0 bottommargin=0 leftmargin=0 rightmargin=0>
<object id="StatusBar1" classid="CLSID:8E3867A3-8586-11D1-B16A-00C0F0283628" width="100%" height="100%" style="position:absolute;left:0;top:0;">
<PARAM NAME="OLEDropMode" VALUE="1">
</object>
</body>
</html>
――――――――――――――――――――――――――――――――――――――
どうも、Common Controlが2系統あるようですが、どういうことでしょう?
どういう使い分けが必要なのでしょうか?
Microsoft StatusBar Control, version 6.0
{8E3867A3-8586-11D1-B16A-00C0F0283628}
MSCOMCTL.OCX

Microsoft StatusBar Control, version 5.0 (SP2)
{6B7E638F-850A-101B-AFC0-4210102A8DA7}
COMCTL32.OCX

因みに、上の例では前者を使っています。後者を使うと
Data.files.Count
で、何故かエラーになります。
ExcelでData As ComctlLib.DataObjectと宣言すると、大丈夫なようで、
大昔のFolderItemVerbを彷彿させます。

魔界の仮面弁士 さん 2004年 07月 21日 10時 57分 58秒

》エルさん
> ハングアップします・・・。
詳しく検証したわけではありませんが、どうやら古いバージョンでは、
"Content-Length"が無い時に 0バイトの応答を受けると、
フリーズしてしまう事があるようです。

# MSXML5は、結構安定しているようです。MSXML6は…。

> ここからどうやってファイルを取得(ダウンロード)につなげるのか・・・。
レスポンスの受け取り方は、

》魔界の仮面弁士 2004年01月23日 16時35分18秒
の投稿を参照してみてください。

今回の場合、ファイルのバイナリを読む事になるので、
responseBodyプロパティを使う事になります。
ファイル名は、.getResponseHeader("Content-Type") で取れます。

ファイルへの保存に関しては、ADODB.Streamを使って、こんな感じで。

Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Set Stm = WScript.CreateObject("ADODB.Stream")
Stm.Open
Stm.Type = adTypeBinary
Stm.Write objXMLHTTP.responseBody
Stm.SaveToFile "C:\TEST.CSV", adSaveCreateOverWrite
Stm.Close
Set Stm = Nothing

エル さん 2004年 07月 21日 02時 09分 15秒

下記に補足2(その後の経過)
msxml4.dllを魔界の仮面弁士さんが教えてくれたリンクからインストールしたらMSXML2.XMLHTTP.4.0で無事動作しました。XPには標準で入ってるもんだと思ってました。
しかし、ここからどうやってファイルを取得(ダウンロード)につなげるのか・・・。ファイルの情報を取得できると思っていたのですが。

エル さん 2004年 07月 21日 00時 55分 27秒

下記に補足です。
MSXML2.XMLHTTP.4.0やMSXML2.ServerXMLHTTP.4.0を使用すると何も取得できず、かといってMicrosoft.XMLHTTP、MSXML2.XMLHTTPではハングアップします・・・。Win2k+IE6SP1,WinXP+IE6SP1

エル さん 2004年 07月 21日 00時 39分 16秒

>魔界の仮面弁士 さん
お返事ありがとうございました。
ところで、下記のソースで
xmlHttpRequest.send "Submit=%91%97%90M" のようにsendした後って
どうしたらよいのでしょうか?
xmlHttpRequest.responseStreamのような感じで値を取得できるかと思いきや、xmlHttpRequestには何も取得できていない・・・。それとも全く別の方法になるのでしょうか?何度もすいません。

魔界の仮面弁士 さん 2004年 07月 20日 23時 32分 05秒

》 エル さん
> もはやWSHにこだわってないのですが
WSHやVBAからのダウンロード制御であれば、さほど問題は無いと思います。

# IEからの実行(HTML上のスクリプトによる実行)だと、無理そうですけど。

> 1時間おきくらいに売り上げデータのようなものを自動でダウンロードして処理したいからです。
その形態なら、まさに XMLHTTP + ADODB.Stream が使えますね。

> Set xmlHttpRequest = CreateObject("Microsoft.XMLHTTP")
> xmlHttpRequest.Open "POST", "http://www.includez.com/wsh/downloader.php", False
> xmlHttpRequest.send
POSTで送る場合、適切な "Content-Type" も指定しないと、
サーバ側が正しい結果を返してくれない可能性があります。
setRequestHeaderメソッドで、ヘッダ情報も送出してみてください。

Set xmlHttpRequest = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttpRequest.Open "POST", "http://www.includez.com/wsh/downloader.php", False
xmlHttpRequest.setRequestHeader "Referer", "http://www.includez.com/wsh/form.htm"
xmlHttpRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlHttpRequest.send "Submit=%91%97%90M"


それと、できれば "Microsoft.XMLHTTP"は、使わない方が良いと思います。

古いバージョンゆえ、「殆どのPCにインストール済み」という利点はありますが、
サーバ側の応答内容によっては、XMLHTTP がハングアップしてしまうなどの
弊害があります。上位バージョンの物を使った方が安定するでしょう。
http://www.interq.or.jp/japan/koi_san/trash/2004/msxml.htm

# タイムアウトの指定なども必要なら、ServerXMLHTTP を使う事ができます。

エル さん 2004年 07月 20日 22時 03分 16秒

いりや さん、魔界の仮面弁士 さん ありがとうございます。
とりあえずテスト用にページ作りましていろいろ試しているところです。
http://www.includez.com/wsh/form.htm (こんな感じです。ただし、実際はcsvファイルには直アクセスできない)
下記のような感じで(VBAですが)実現できたらな、と淡い期待をしたのですが、やはり無理でした。もはやWSHにこだわってないのですが、何か実現できる方法がありましたら教えてください。
Set xmlHttpRequest = CreateObject("Microsoft.XMLHTTP")
xmlHttpRequest.Open "POST", "http://www.includez.com/wsh/downloader.php", False
xmlHttpRequest.send
pResponseText = xmlHttpRequest.responseStream

>いりや さんへ
自動で行いたいのは1時間おきくらいに売り上げデータのようなものを自動でダウンロードして処理したいからです。(できたらバックグラウンドで)
現行のシステムそのままでなるべく手をかけずにということでWSHを検討しています。顧客端末にvbsファイルをおき、それをタスクスケジュールで1時間おきに動かす、というようなことを目指しています。


ばんのしゃーによかばんた さん 2004年 07月 20日 21時 23分 57秒

>しめさば さん 2004年 07月 13日 18時 00分 15秒
>ie.MenuBar = False
>ie.ToolBar = False
>ie.Visible = True
>ie.Resizable = False
>ie.Width=1024
>ie.Height=740
>ie.Top=0
>ie.Left=0

ひょっとして、最大化ではなく、全画面にしようとしている ?
それなら、

甲案 ie.FullScreen=True + body.scroll="no"を使う。

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Navigate "about:mozilla"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.FullScreen=true
ie.Visible=True
Do While Not OnQuit
WScript.Sleep 100
Loop
Sub IE_DocumentComplete(pdisp,url)
ie.Document.body.scroll="no"
ie.Document.body.style.border="none"
End Sub
Sub IE_OnQuit()
OnQuit=True
End Sub

乙案 ie.TheaterMode=True + body.scroll="no"を使う。

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Navigate "about:mozilla"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.TheaterMode=true
ie.toolbar=false
Do While Not OnQuit
WScript.Sleep 100
Loop
Sub onresize()
'WScript.Echo ie.TheaterMode
End Sub
Sub IE_OnQuit()
OnQuit=True
End Sub
Sub IE_DocumentComplete(pdisp,url)
ie.Document.body.scroll="no"
ie.Document.body.onresize=GetRef("onresize")
End Sub


ばんのしゃーによかばんた さん 2004年 07月 20日 21時 23分 10秒

>しめさば さん 2004年 07月 13日 18時 00分 15秒
>WSHでブラウザ(IE)を起動する際に、スクロールバーを強制的に
>消したいのですが、何か方法がないでしょうか?

甲案 ie.document.body.scroll="no"
※ ie.document.bodyなので、Navigateごとにセットし直す必要がある。

set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Navigate "about:mozilla"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Top=0
ie.Left=0
ie.Width=ie.Document.parentWindow.screen.width
ie.Height=ie.Document.parentWindow.screen.height
ie.MenuBar=False
ie.ToolBar=False
ie.StatusBar=True
ie.Resizable=False
ie.Visible=True
Do While Not OnQuit
WScript.Sleep 100
Loop
Sub IE_DocumentComplete(pdisp,url)
ie.document.body.scroll="no"
End Sub
Sub IE_OnQuit()
OnQuit=True
End Sub

乙案 window.open + "scrollbars=no"を使う。
※ Navigateごとにセットし直す必要はないが、最初にIEを取り直す手間が掛かる。

Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
Set window=ie.Document.parentWindow.open("about:blank","","left=" & ie.Document.parentWindow.screen.width & ",top=" & ie.Document.parentWindow.screen.height & ",scrollbars=no")
Set shell=CreateObject("Shell.Application")
For Each ix in Shell.Windows
If ix.Document.parentWindow is window Then Exit For
Next
ie.Quit
Set ie=ix
ie.Visible=False
ie.Top=0
ie.Left=0
ie.Width=ie.Document.parentWindow.screen.width
ie.Height=ie.Document.parentWindow.screen.height
ie.MenuBar=False
ie.ToolBar=False
ie.StatusBar=True
ie.Resizable=False
ie.Navigate "about:mozilla"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Visible=True
Do While ie.Visible
WScript.Sleep 100
Loop

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

SelectionChangedの使用法です。
2000/XPでは、ShellFolderViewOC経由で接続します。
ただし、フォルダの移動でリセットされるようです。
そのため、IE_DocumentCompleteイベントでフォルダごとに設定し直します。
――――――――――――――――――――――――――――――――――――――
Set fv=CreateObject("Shell.FolderView.1")
Call WScript.ConnectObject(fv,"FV_")

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Visible=True
ie.Navigate "c:\"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop

Do While Not OnQuit
WScript.Sleep 100
Loop

WScript.Quit

Sub FV_SelectionChanged()
Wscript.Echo "SelectionChanged",ie.document.focuseditem
End Sub

Sub FV_EnumDone()
Wscript.Echo "EnumDone"
End Sub

Sub IE_DocumentComplete(pdisp,url)
Wscript.Echo url
Wscript.Echo fv.SetFolderView(ie.document)
End Sub

Sub IE_OnQuit()
OnQuit=True
End Sub
――――――――――――――――――――――――――――――――――――――
98では、ShellFolderViewOCを経由せず、直接、接続します。
ただし、WebViewのみです。
――――――――――――――――――――――――――――――――――――――
Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Visible=True
ie.Navigate "c:\"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop

Do While Not OnQuit
WScript.Sleep 100
Loop

WScript.Quit

Sub FV_SelectionChanged()
Wscript.Echo "SelectionChanged",ie.document.focuseditem
End Sub

Sub FV_EnumDone()
Wscript.Echo "EnumDone"
End Sub

Sub IE_DocumentComplete(pdisp,url)
Wscript.Echo url
Wscript.Echo TypeName(ie.document)
If TypeName(ie.document)="WebViewFolderContents" Then
Call WScript.ConnectObject(ie.document,"FV_")
End If
End Sub

Sub IE_OnQuit()
OnQuit=True
End Sub
――――――――――――――――――――――――――――――――――――――

いりや さん 2004年 07月 20日 02時 56分 15秒

魔界の仮面弁士さん、

ご説明ありがとうございます。意識あったと思います。

エルさんの取り組まれているシステムの全容をみて、魔界の仮面弁士さんが解説
されているどの通信方式を採用すべきかどうか判断すべきだと思いました。

エルさん、

補足の PHP ソースの引用ありがとうございます。シナリオの全容がわからない
ので教えていただいた範囲で書いています。

ファイルのダウンロード操作時の GUI 操作を HTML スクリプトで肩代わりする
方法が当初のご質問だったと理解していますが、HTML スクリプトに仕込む場合
は HTML スクリプトエンジンの実装上の制約に留意しなければならないので少々
面倒かもしれません。

魔界の仮面弁士さんがおっしゃっている IObjectSafety を実装した ActiveX コ
ントロールを作成する方式は、マイクロソフトのガイドラインに沿った望まれる
方式だとおもいます。

ウェブ・ブラウザのクライアントを使用することが前提でないのであれば、ウェ
ブ・ブラウザの層を HTTP の層まで落として、HTTP 電文を処理するための COM
オブジェクトを別のスクリプトエンジン (Windows Script Host, UWSC,
ActivePerl などの COM のインターフェイスをサポートする言語処理系) で操作
する方法がありますね。これはすでに述べた方式で、これだと GUI の話はそも
そも起きないことになります。

あと、サーバ側の仕様に手を入れることになりますが、俗に言う One-time URL
(タイマ値を持った一定期間有効な URL) を発行して、利用者にそれを教える
(HTML 画面にアンカーの href に設定する or メールで URL を連絡する) とい
うようなインターフェイスをサーバが提供してくれるのであれば、その
One-time URL を使って Microsoft.XMLHTTP オブジェクトと Adodb.Stream オブ
ジェクトの組み合わせでダウンロードしてローカルディスクに格納保存すること
はできます。

ところで、話が横にそれますが、利用者にとって、ダウンロード時の GUI 操作
を利用者にかわってスクリプトが肩代わりしてくれることが、利用者にとってこ
のシナリオ全体でどの程度ハッピーなのか知りたいところです。

というのは、クライアントがフォームに記入してサブミット・ボタンを押下した
後にファイルをダウンロードする、というシナリオで、顧客の重要データのため
動的に HTTP レスポンスの上に乗せて渡すのであれば、利用者に保存ボタンと格
納先のディレクトリを指定させるのはけしてたいへんな作業ではないような気が
しました。

(もちろん、この印象は、わたしの個人的な操作の精神的な負荷基準に基づくも
ので一般論ではありません)

魔界の仮面弁士 さん 2004年 07月 20日 01時 00分 22秒

》 いりや さん
> ここでいう制御は HTML に書かれたスクリプトの中から、という意味だと思って
> いますけどあっていますでしょうか。
はい、そう意味で書きました。


例えば、HTML上のスクリプトにて、ダウンロードを制御するのではなく、
クライアントPC上にあるWSFファイルから制御しているのであれば、
セキュリティ上の制約が殆んど無いので、特に問題は無いと思います。

この時、IEを制御するのではなく、クライアントからXMLHTTPを
使って通信すれば、IEが行っているリクエストとほぼ同等の
HTTP要求ヘッダ/要求ボディを、Webサーバに送る事ができますので
DHTMLでの制限の多くを回避できます。

# クライアント上に配置したスクリプトからの通信、という運用形態が
# 認められないのであれば、この方法も使えない事になりますけど。


> そういうことを禁止もしくはセキュリティーレベルを利用者が
> 制御する仕掛けをプログラムに施しているのだろうと思っています。
COMコンポーネントでは、「IObjectSafety」というインターフェイスが、
その仕掛けを担っています。この実装により、Internet Explorer に
[セキュリティの警告]ダイアログを表示する必要が無い事を通知できます。

といっても、VBScript/JScriptには、インターフェイスを実装する
仕組みは用意されていませんから、HTML上のスクリプトでやるなら、
他の言語で、IObjectSafetyを実装したActiveXコントロールを作り、
それを媒介として、HDDへの保存を行う必要があるように思えます。

いりや さん 2004年 07月 20日 00時 25分 44秒

セキュリティーにからむ話なので、議論を続けてよいか皆さんの判断をあおぎた
く私の考えを述べますね。

引用した UWSC の議論やエルさんの技術的な課題は、ダウンロードに伴う GUI
操作の自動化 -- ウェブ・ブラウザのナビゲーションの自動化の一問題 -- とし
て捉えていますので、この問題への取り組みそのものは、後述する開発ベンダの
施した仕掛けをなんら脅かすものではないので問題ないだろう、だから議論する
ことは問題ないと思っていますが、いかがでしょう。> 有識者の皆さん

[ 補足 ]

魔界の仮面弁士 さん wrote:
| 》 いりやさん
| > ただ Dynamic HTML Object Model のマニュアルをよんでいる限りで
| > はそういうインターフェイスをユーザに解放しているのをみかけたことはないで
| > す。
| おそらく、スクリプトベースでの対処法は無いと思います。
| (制御できてしまったとしたら、MSのSecurity Teamが黙っていないでしょう)

ここでいう制御は HTML に書かれたスクリプトの中から、という意味だと思って
いますけどあっていますでしょうか。

例えば、

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

この記事で話題になった INPUT TYPE=FILE エレメントの value 属性を HTML に
書かれたスクリプトで制御 (具体的には value 属性に対する代入操作) ができ
るようになるとクライアントのローカルディスクのデータが悪意ある第三者によっ
てすっぱ抜かれてしまう可能性が生まれる。

直接的でなくとも間接的に GUI を遠隔操作するスクリプトの実行を許すように
なっていても同様の効果が得られます。

そういう悪意ある第三者の利用を警戒して、HTML スクリプトエンジンの開発ベ
ンダ (IE であればマイクロソフト社) は、そういうことを禁止もしくはセキュ
リティーレベルを利用者が制御する仕掛けをプログラムに施しているのだろうと
思っています。

ですから、

エルさん wrote:
| IEのdocument等のオブジェクトが取得できるのでダイアログボックスのオブジェ
| クトも取得できるのかなと当初思ったのです。

エルさんの「ダイアログボックスの遠隔操作」を可能にする仕掛けを利用者に解
放した場合に、悪意ある第三者によってバックドア系のソフトウェアを強制イン
ストールして自分の PC の制御を奪う可能性ができるので、HTML スクリプトエ
ンジンの開発ベンダは、そういうインターフェイスを公開することはないだろう、
と予想しています。

これは方式として前述の方針と合致しないので NG なだけで、ナビゲーションの
自動化の一問題として、ダウンロード時の GUI 操作の自動化を何とかできない
か考えること自体、開発ベンダの施した仕掛けをなんら脅かすものではないので
問題ないだろうと思っています。

エル さん 2004年 07月 20日 00時 17分 44秒

>いりや さん

いい忘れました。ご指摘のとおり、vectorと同じような感じです。
「ファイルのダウンドード」ウィンドウが表示され保存するか聞かれる箇所です。

エル さん 2004年 07月 20日 00時 08分 08秒

>いりや さん

Formのボタンを押すことによりPHPにユーザーID等を渡します。
すると、下記のようなソースのPHPがファイルを吐き出すといった感じです。
お客さんそれぞれの重要データなので直にアクセスしてダウンロードはできないようにしているのです。

※PHPのソースはこんな感じです(参考までに)
//ダウンロード用ヘッダ
header("Content-disposition: attachment; filename= $filename");
header("Content-Length: ".$content_length);
header("Content-Type: application/octet-stream");
//ダウンロードファイルを吐き出す
readfile($filename);

いりや さん 2004年 07月 19日 23時 50分 55秒

エルさん、

| Formのボタンをクリックしたタイミングで、PHPを利用してサーバーのローカル
| にあるファイルをユーザーにダウンロードさせるようにしているので、WEBから
| 直接ファイルへアクセスできないのです。

向学のために、フォームのサブミットボタンを押した後のサーバとクライアント
のシーケンスをもすこし教えていただいてもよろしいでしょうか。

サーバ上のファイルを HTTP の上に乗せて渡すのであれば URL で指定できさえ
すれば問題ないと思うのですが、たぶんそういう形で渡せないシナリオなのだろ
うな、という漠然とした想像はしていますが。

たとえば、ベクターのサイトにファイルをダウンロードするボタンを押すと、

<META
HTTP-EQUIV="Refresh"
CONTENT="0;URL=http://my.vector.co.jp/servlet/System.FileDownload/download/ftp/0/26842/pack/win95/util/arc/lhasa017.exe"
>

のような情報をもとにサーバ側のサーブレットが起動されてダウンロードが始ま
るのですが、こうしたときダウンロードを継続するか判断をもとめるダイアログ
が表示されます。こんなのかな??

魔界の仮面弁士 さん 2004年 07月 19日 23時 40分 49秒

》 いりやさん
> ただ Dynamic HTML Object Model のマニュアルをよんでいる限りで
> はそういうインターフェイスをユーザに解放しているのをみかけたことはないで
> す。
おそらく、スクリプトベースでの対処法は無いと思います。
(制御できてしまったとしたら、MSのSecurity Teamが黙っていないでしょう)

> Adodb.Stream オブジェクトを使用した方式 [*] はさほど悪くないと思うんですが
『管理人むたぐち さん 2004年 07月 04日 12時 00分 28秒』の問題がありますよね。

今月のWindows Updateにて、トロイの木馬型ウイルス「Download.Ject(JS_JECT.A)」を
回避するパッチが適用されますが、この影響で、現在はHTML上でのStreamの生成が
禁止されています。(レジストリを修正しないと、生成できないようになりました)

# 当方では、XMLHTTP.responseText が文字コード判定に失敗して化けるという
# 問題を、「.responseBodyをStreamで変換する」という手法で回避していたので、
# このパッチ修正により、既存プログラムの修正を余儀なくされてしまいました。(^_^;)

Return