om さん 2004年 03月 23日 17時 17分 29秒

フォルダC:\AAAAフォルダ下にあるファイルと
フォルダC:\BBBBフォルダ下にあるファイルを
ファイル名で比較し、一致するファイル名が存在するか
しないかを判別できるようなコードが
わかれば教えて下さい。
宜しくお願いします。

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

訂正。

> PID=Mid(Lines(k),InStr(Lines(k),"(")+1,InStr(Lines(k),")")-InStr(Lines(k),"(")-1)
> PPID=Mid(Lines(k+1),InStr(Lines(k+1),"(")+1,InStr(Lines(k+1),")")-InStr(Lines(k+1),"(")-1)

は、正しくは以下です。

PID=Mid(Lines(k-1),InStr(Lines(k-1),"(")+1,InStr(Lines(k-1),")")-InStr(Lines(k-1),"(")-1)
PPID=Mid(Lines(k-2),InStr(Lines(k-2),"(")+1,InStr(Lines(k-2),")")-InStr(Lines(k-2),"(")-1)

SEN さん 2004年 03月 22日 20時 54分 14秒

ローカル環境へLPRポートの追加を行いたいのですが。
どなたかご存じの方いませんでしょうか?

yama さん 2004年 03月 22日 10時 16分 11秒

起動時に、ボリュームをオフにしたいのです。
ボリュームコントロールをミュートするスクリプトは
どのように作ればよいでしょうか?

ばんのしゃーによかばんた さん 2004年 03月 21日 21時 39分 49秒

>cmd /cfor /f %%p in ('tlist -p wscript.exe') do kill %%p

%%はバッチ内の記法でした。正しくは、以下。

cmd /cfor /f %p in ('tlist -p wscript.exe') do kill %p

ほかにもtlistは有用です。

例えば、getpidやgetppidは、
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("tlist -t")
Do While oExec.Status=0
WScript.Sleep 100
Loop
Lines=Split(oExec.StdOut.ReadAll(),vbCRLF)
For k=UBound(Lines) To 0 Step -1
If InStr(Lines(k),"tlist.exe (")>0 Then
PID=Mid(Lines(k),InStr(Lines(k),"(")+1,InStr(Lines(k),")")-InStr(Lines(k),"(")-1)
PPID=Mid(Lines(k+1),InStr(Lines(k+1),"(")+1,InStr(Lines(k+1),")")-InStr(Lines(k+1),"(")-1)
Exit For
End If
Next
WScript.Echo PID,PPID

Windowタイトル->pidは、
Title="VBscript"
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("tlist " & Title)
Do While oExec.Status=0
WScript.Sleep 100
Loop
Lines=Split(oExec.StdOut.ReadAll(),vbCRLF)
For k=0 To UBound(Lines)
If IsNumeric(Left(Lines(k),4)) And Mid(Lines(k),5,1)=" " Then
PIDs=PIDs & vbTAB & Left(Lines(k),4)
End If
Next
WScript.Echo PIDs
WScript.Echo UBound(Split(PIDs,vbTAB))

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

> 放蕩息子 さん 2004年 02月 25日 14時 52分 24秒
>
>  環境:Windows2000,WBS5.6
> A.vbs(Windows起動時に起動) 及び B.vbs(C.vbs起動する前) が起動中で、
> C.vbs にてA.vbsのみを強制的に停止したいと考えております。

の件ですが、こういうのは如何でしょうか。

甲案
Windows2000 Support Tools (C:\Program Files\Support Tools にある)の
TLIST.EXE と KILL.EXE を使う。

tlist.exe -p wscript.exe
で、a.vbs のpidが標準出力に出るので、読み取って、
kill.exe pid
する。
wShell.Execして標準出力を読み取ってwShell.Runするのが面倒なら、
cmd /cfor /f %%p in ('tlist -p wscript.exe') do kill %%p
をwShell.Runする。

乙案
もし、a.vbsが自分で停止できるなら、
a.vbsは最初に特定のファイル(停止指示ファイル)を消す。
If fso.FileExists("c:\temp\stop.tmp") Then fso.DeleteFile "c:\temp\stop.tmp"
処理ループの中で停止指示ファイルがあれば終了する。
If fso.FileExists("c:\temp\stop.tmp") Then
'終了処理
End If
c.vbsは停止指示ファイルを作る。
fso.CreateTextFile("c:\temp\stop.tmp",True).Close

もし、c.vbsがa.vbsの終了を待ち合わせする必要があるなら、
c.vbsは最初に終了通知ファイルを消す。
If fso.FileExists("c:\temp\done.tmp") Then fso.DeleteFile "c:\temp\done.tmp"
停止指示ファイルを作る。
fso.CreateTextFile("c:\temp\stop.tmp",True).Close
終了通知ファイルが出来るのを待つ。
Do While fso.FileExists("c:\temp\done.tmp")=False
WScript.Sleep 1000
Loop

a.vbsは先程の処理に加えて終了処理の後に終了通知ファイルを作る。
fso.CreateTextFile("c:\temp\done.tmp",True).Close

というような具合です。

mapo さん 2004年 03月 19日 21時 55分 08秒

VBやJSには詳しくないのでハード絡みの処理についてはなんともいえないんです
けどW2000サーバーでの自動化や管理については英語ですが参考になるかと思い
ます。コード試して見て下さい。

http://www.rallenhome.com/books/adcookbook/code.html

残念ながら翻訳はまだ出てません。ウインドウズ環境でもPerlご存知の方なら試
して見られたらいかがでしょう。

ばばろあ さん 2004年 03月 19日 21時 49分 18秒

はじめまして!

Outlook Expressを起動し
Sendkeyを使ってファイルを添付して送信するスクリプトを書きました。

このスクリプトをPCから直接ダブルクリックすると正しく動くのですが、
HULFTというソフトから起動すると、
OEが立ち上がっただけで終了してしまいます。(OEはずっと上がったまま)

HULFTからの起動時は「cscript D:\xxx.vbs」と指定しています。

どうやったら正しく動くのか、
どなたかご教授頂ければ幸いです。
「これでどうかな?」なご意見も大歓迎です。
よろしくお願いします。

**********************************************************************

'オブジェクトを生成
Set goShell = WScript.CreateObject("WScript.Shell")

'メールアドレスをセット
gsAddress= "xxx@yyy"

'メールの中身をセット
gsMail_Body = "エラー発生!"

'Outlook Expressを起動
goShell.Run gsRun_String & gsAddress & "?subject=エラー発生!&body=" & gsMail_Body

'Outlook Expressが起動しきるまで待つ
WScript.Sleep 5000

'ファイルを添付(キー入力)
goShell.SendKeys "%i"
goShell.SendKeys "a"
goShell.SendKeys "D:\Error_log.txt"
goShell.SendKeys "%a"

'メール送信(キー入力)
goShell.SendKeys "%s"

**********************************************************************

ひまわりかな さん 2004年 03月 19日 11時 45分 54秒

こんにちは。
レベルの高い皆様に混じって、
質問するのは、とても躊躇してしまうのですが、
少し教えていただけますでしょうか。

以下のことをコンピュータ起動時にスクリプトより
実行させたいと思うのですが・・・。

1.マイコンピュータ内のリムーバブルメディアのアイコンを非表示にする。
2.消したかわりにリムーバブルメディアのショートカットを表示させて
 そのリンク先を任意の(%systemroot%などに置いた)VBSファイルにする。

・・・もしくは、「リムーバブルメディアのアイコンをダブルクリックすると、
VBSファイルを実行できる」方法でもいいのですが、これはWSHで可能でしょうか。

「1.」を試作すべく、自分なりにいろいろ調べたのですが、
マイコンピュータの中にごみ箱を設置するとか、
FDDのアイコンを表示する値は見つけれても、
リムーバブルメディアに関する事は手がかりが得られませんでした。

何か、よい方法をご存知の方は、教えてください。
よろしくお願いいたします。

nora4 さん (no@nakayoshi.cc) 2004年 03月 18日 18時 20分 59秒

はじめまして。
社内で外部媒体の取り扱いが禁止になりFDDやUSBを使用できなくする方法を
探しています。
クライアントはWindows2000です。

WSHでデバイスの無効化やUSBの機能を停止するといったことが出来るのでしょうか?
誰かアイディアやテクニックを教えてください。
よろしくお願いします。


ただし さん 2004年 03月 18日 14時 26分 34秒

# > LinuxでASPは使えるのでしょうか?

私もchill、今はSUN、を試して見たんですがLinuxでわざわざお金か
けてまでASPを動かす意味があるのかと思って止めました。

既存のASPソースが既にあってサーバーをMSから代えるのなら意味あ
ると思いますが、最初から作るならOSを選ばないPHPの方が良いと思
います。LinuxにはASPからPHPへの変換コマンドもありますよ。

JavaベースならiASPがあります。

http://www.xlsoft.com/jp/products/stryon/index.html

すなずり さん 2004年 03月 18日 00時 36分 51秒

アクティブディレクトリから、ユーザ情報を取り出そうとしているのですが、
ドメインコントローラ名を指定しなくても、接続する方法は無いでしょうか。

一応ADOで接続することを考えているのですが、
DC名が変更になるかもしれないので、DC名なしでやってくれと言われているのです。

最初考えていたのは、ADOで、LDAP名前空間を使用して、接続しようとしていたのですが、
この方法では、ドメインコントローラーが必要になるため、できなくなりました。
よろしくお教えください。

魔界の仮面弁士 さん 2004年 03月 17日 21時 53分 51秒

≫ POP さん
> LinuxでASPは使えるのでしょうか?

使用できますよ。(Active Server Pagesの事ですよね)

少々古い記事ですが、下記のページが参考になるかと思います。
http://www.interq.or.jp/www-user/komurak/chiliasp/

POP さん 2004年 03月 17日 21時 39分 03秒
URL:ASP

LinuxでASPは使えるのでしょうか?
Windowsだけでしょうか?
宜しくお願いします。

oo さん 2004年 03月 17日 00時 31分 54秒
URL:http://otn.blogtribe.org/entry-e1effc707199cdbed368789b2aec4426.html

oo (otn) です。

>> 1行スクリプト
>> COMMAND /Cecho MsgBox "aaa" ^| CScript //E:VBS -
>は、
>echo MsgBox "aaa" | COMMAND /CCScript //E:VBS -
>でもよいようです。

これはどうしてでしょうね。
command /c echo Msgbox "aaa" ^| dir /a /od %TEMP%
だと、擬似パイプの中間ファイルが出来ていることがわかり、CScript - もファイルからのリダイレクトなのでうまく行くのはわかります。
echo Msgbox "aaa" | command /c dir /a /od %TEMP%
だと、NT系の本物のパイプなので当然中間ファイルが無いです。
なぜCSCRIPTのパイプがうまく行くのか、ちょっと研究してみたいですね。

>なおかつ、#ここが重要# 標準入力のパイプとリダイレクションも可能になります。
>同様にして、JScriptやAWKやPerlでも標準入力が自在に使えるようになります。

BAT,CMD以外のスクリプトの拡張子関連付け起動で、標準入力のリダイレクトが出来ないのはWindowsのバグだったようです。拙ページですが、
http://otn.blogtribe.org/entry-e1effc707199cdbed368789b2aec4426.html
をご覧ください。最新SPのW2K,WXPならレジストリ修正で対応できます。

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

こないだからどうも。

> 1行スクリプト
> COMMAND /Cecho MsgBox "aaa" ^| CScript //E:VBS -
は、
echo MsgBox "aaa" | COMMAND /CCScript //E:VBS -
でもよいようです。

!!! (=ひょっとして)

以下のコマンド実行します。

assoc .VBC=VBCFile
ftype VBCFile=%%SystemRoot%%\System32\Command.com /CCScript //E:VBS //NoLogo "%%1" %%*
set PATHEXT=.VBC;%PATHEXT%

これにより、hoge.VBSをhoge.VBCとリネームすれば、hogeだけでCScript起動が
できるようになります。
なおかつ、#ここが重要# 標準入力のパイプとリダイレクションも可能になります。

同様にして、JScriptやAWKやPerlでも標準入力が自在に使えるようになります。

初心者 さん 2004年 03月 16日 21時 29分 03秒

いりやさん
返答、ありがとうございました。
もっと勉強します。

いりや さん 2004年 03月 16日 10時 20分 09秒

> DOS窓が閉じない方法はありますか?

var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run ("cmd.exe /k ping");

P.S. cmd /? (/k option) をご覧あれ

初心者 さん 2004年 03月 16日 02時 42分 05秒

初めまして。
質問があります。

スクリプトからDOSコマンドを実行すると、コマンド終了後にDOS窓が閉じてしまいます。DOS窓が閉じない方法はありますか?
よろしくお願いします。

下に記述したやり方だと、DOS窓が閉じてしまいます。
  var WshShell = new ActiveXObject("WScript.Shell");
  WshShell.Run ("ping");


FFT さん 2004年 03月 15日 23時 25分 04秒

web 上でアプリケーションが出来るのが、ASPなんですが、
JAVAもweb上で動かせます。どのように違うのでしょうか?
宜しくお願いします。

oo さん 2004年 03月 15日 20時 22分 40秒

oo (または otn) と申します。

おおすごい!それでW2K,XPでもパイプが出来ますね。
実は私も以前、BATとVBSを1ファイル中に書きたくて、

@echo off
echo This is in BAT.
findstr /e "'VBS" %~f0 | cscript //E:VBS -
goto :eof
WScript.echo "This is in VBS." 'VBS

のようなことをやってみたんですが、パイプが使えず駄目で諦めていました(findstrの結果を一時ファイルに書けばいいんですけどね)。

command /c findstr /e 'VBS %~f0 ^| cscript //E:VBS -
でうまく行きました。まあこれでも内部的には一時ファイルを使っているわけなんですが、command.comのこういう使い方は今後も何かに使えそうです。

JScript だと、うまい具合に@setコマンドと/* */があるので、

@set @_=1//&@echo off&goto bat
WScript.Echo("This is in Jscript.");
WScript.quit(0);
/*
:bat
echo This is in BAT
CSCRIPT //nologo //E:jscript "%~f0"
rem */

とできるんですが、VBSだと複数行コメントの機能が無いので同様の手法が使えません(BAT部分がコンパイルエラーになる)。

ばんのしゃーによかばんた さん 2004年 03月 15日 19時 27分 29秒

毎度お世話になっております。

> Need -E option.
> -E option requires name of script engine.

もうひとつ、

UNIX標準のPOSIX 1003.2の標準シンタクスルールに部分的に似せているようです。

- オプションの記号は「//」だけでなく、「-」も使用可能。
cscript -nologo -u -cp:850 hoge.vbs などのように。//cp:#codepageは隠し。
- オプションと引数の区切りに「--」を使用可能。
cscript -nologo hoge.vbs -logo なら-logoはhoge.vbsに渡る。
cscript //nologo hoge.vbs //logo だと//オプションはすべてcscriptに渡る。
cscript //nologo -- hoge.vbs //logo だと//logoはhoge.vbsに渡る。
cscript -nologo -hoge.vbs だと-hoge.vbsはオプションでエラー。
cscript -nologo -- -hoge.vbs だと-hoge.vbsはファイル。
- ファイル指定に「-」で標準入力を意味する。

> 単純な応用としては、スクリプト内で子スクリプトを生成して、ExecでCScriptに
> StdIn経由で喰わせる。パラに走る子スクリプトを別ファイルを作らずに実行できます。

他の応用として、
1行スクリプト

Unixのhere document擬な#!行擬
が考えられます。

と思いましたが、パイプがうまく扱えないようです。
これでは、応用が全滅です。

ですが、コンソールとリダイレクションならOKです。
そこで、COMMAND.COMの疑似パイプを使ってみました。

1行スクリプト
COMMAND /Cecho MsgBox "aaa" ^| CScript //E:VBS -

Unixのhere document擬な#!行擬
@COMMAND /CMORE +1 %0 ^| CScript //E:VBS - & GOTO :EOF
WScript.Echo "AAA"
WScript.Echo "BBB"
WScript.Echo "CCC"

VBScriptの先頭に上記の1行を加えて、拡張子をCMDに変えれば出来上がり。
難点は標準入力を使っているのでスクリプトから標準入力が使えないことです。

最初の応用については同じ手が使えるか研究中です。


ばんのしゃ-によかばんた さん 2004年 03月 14日 20時 26分 55秒

初めまして。毎度お世話になっております。

さて、早速ですが、
strings /u cscript.exe > file
としましたところ、

(注)ここで、strings.VBSは、
バイナリファイルからSJIS/Unicode文字列を抽出するVBScript
http://www.vector.co.jp/soft/win95/util/se319337.html
です。

以下のような文字列がありました。
Need -E option.
-E option requires name of script engine.
Can't read script from stdin.

これは??? !!!と思い、試してみたところ、 (注 ??=何、!!!=ひょっとして)

CScript //E:VBS -

これで、標準入力から、スクリプトが読み込めます。
と言ってもインタラクティブにはなりません。^ZでEOFにしないと実行してくれません。

単純な応用としては、スクリプト内で子スクリプトを生成して、ExecでCScriptに
StdIn経由で喰わせる。パラに走る子スクリプトを別ファイルを作らずに実行できます。

まずはご一報まで。(まさか公知公用ではありますまいな。)

ただし さん 2004年 03月 14日 13時 24分 39秒

私もコーヒーを一杯。先日カミさんが知り合いの日系
ブラジル人の方から本場のブラジル・コーヒー豆の真
空パック詰めを貰って来ました。同じ分量でもかなり濃
いです。

>そのため、いつも「ワイデュスティーエイチ」と口にしな
>がら打ち込んでいました。

いやいやこの手の恥ずかしい思いは本業になってから
も数限りなくあり思い出す度に赤面しますね。

winsockをwindsock と間違えて会議で赤恥かきまし
た。その逆にADSLが導入されだした頃、会議でPPP
OEの事を言ってるのに皆PPPの事しか知らず分かって
もらえませんでした。

以前は努力して外に出て行き知らないところの門を叩
く喜びがありました。インターネット黎明期にはTelnet
サイトもアメリカには結構あって面白かったです。

>しかしその月の電話料金の高さに両親は「パソコン
>通信って>そんなに電話代がかかるのか。」とため息
>をつきました。

私はNTTにはめられた。自宅では33.6Kのモデムでイ
ンターネットにダイアル・アップしていた頃、NTTから突
然ISDN64Kモデムが送られてきた。

箱開けてみると「おめでとうございます。あなたは最新
のISDNサービスのモニターに選ばれました。機材は無
償で貸与しますので後ほどお送り致しますアンケート
のお答え下さい。」と書いてある。嬉々

まさかNTTがいかさま商売する筈ないし、アンケート
に答えても悪用される筈がないと信じて使い始めま
した。今からすれば別にどってこともない体感速度で
すが不安定なダイアルアップとは比べ物にならない。

一月たったある晩「ちょっと見せたいものがある」とカミ
さんに凄まれてNTTからの請求書を突きつけられた。
おおー!何と三万円を越えている。そりゃそうだ。嬉
しくなって夜な夜なLinuxやBSDのパッケージや大き
なソース・コードをがんがんダウンロードしてたんです
からね。冷や汗タラーリ

カミさんにこっぴどく叱られて少しは辛抱するようにしま
したがそれでも翌月も三万近く行ってしまいカミさんは
激怒しました。仕方なくテレホに入りましたが睡眠時
間は減り事務所じゃ昼行灯。トホホホ

結局数ヶ月でNTTに元とられちゃいました。今ではイ
ンターネットはケーブル・テレビと共用にしましたが、こ
の憎っくきモデムは予備の回線に使ってます。但しド
ライバーのアップデートはW98止りです。

今は常時接続が当たり前になっちゃったが最近は見
知らぬ訪問者が激増してますね。メール系のウイルス
が酷いし、スパム・メールも相変わらずはびこってる。

何でも裏ネットではウイルス・コンテストや覇権争い
が起こってるとか。発端はSCOのLinux提訴と聞い
ていますが本当はどうなのやら。

IPv4を考えた人たちはきっとユーザー性善説に立っ
てたのでしょうね。相手に届くことをまず優先して送
り主の身元をチェックする書留制度までは必要ない
と考えたのかな。全体がIPv6になるとちょっとはまし
になりますかね。

私もいりやさんほどではありませんが、異業種交流
ならぬ異NOS交流が好きですよ。

それでは又


いりや さん 2004年 03月 13日 13時 28分 31秒

いりやです。

コーヒーをもう少しおかわりしてもいいですかね (笑)
普段はしないマルチレスをば。。

>> ひょんさん

| 私も、中二の時、PC-8801 でした。
| といっても親が好きで買ってきたのを、横から遊んでたんですけど。
| BASIC は N88-BASIC で、new on 1 で N-BASIC にチェンジ・・・!
| あの頃は、雑誌の打ち込み必死でしてましたね。
| で、最近OCRでダンプ入力したり・・・。(手打ちの100倍早い?)

New on 1 ! あ〜思い出しました。PC 8001 MK2 も同じ操作で切り
替えられたように思います。

わたしが初めて雑誌の打ち込みをしたプログラムはベーマガに掲
載されていたゲームでした。テンキーを叩いてどんどん伸びる蛇
の頭を操作する、伸びた分だけ得点が加算される、というシンプ
ルなものでしたが、たいへんな作業でした。

なにせ、書かれてあるプログラムの意味がわからない。せいぜい
代入文と簡単な制御構造 (IF, FOR, GOSUB, GOTO) とコロン
(文を一行に並べるときに使う区切子 ":") を追うレベルにとどま
り、あとは雑誌の打ち出しと一字一句見比べるより他に正しさを
確認する術を知らなかったからです。そのため、デバッグは困難
を極めました。

さらに専用の CRT を手に入れるまでは RF モジュレータでテレビ
に表示していました。そのため、にじみが激しかった。それまで
2.0 を誇っていた視力は一気に 0.8 まで落ちました。以来ずっと
眼鏡をかけています。これも一つの職業病かもしれないな。

それでも無事にゲームが走ったときは嬉しかったですね。その日
はそればっかりやっていました。

| で、最近OCRでダンプ入力したり・・・。(手打ちの100倍早い?)

あはは。さいきんスキャナを購入すると OCR 機能を搭載したソフ
トウェアがバンドルされる世の中ですもんね。

打ち込みを減らすのに、出版社からテープが販売されていたので
それを買うこともできたのですが、なにせ、当時はお小遣い。自
分で数千円の買い物をする、という発想がおもいつかない。

それで、工学社の Pio に掲載されていたソノシート (プログラム
をアナログの音声に変換して記録したレコード) を、オーディオ
を持っている両親の知り合いまで持っていってカセット・テープ
に記録してテープ・レコーダからロードさせてみたりしました。
わたしの環境ではほとんどうまくいきませんでしたけど。。

| しかし、実に早期から通信をされてるんですね。
| 周りに通信してる人なんて誰もいませんでしたよ。
}
| 私が通信はじめたのは、9,600bps の頃で nifty でした。
| (その頃の愛機はX68でしたが)

まわりは確かにそうでした。「通信なにそれ?掲示板?」という
状態。

ですが、当時もう通信をしていた人は漢字が使用できる環境でし
たので、ANK だけの PC 8001 MK2 ではキャラクタ文字の羅列でつ
らかったです。わからなくて。

でもチャットをするときはみんな気を使って仮名漢字変換プログ
ラムで半角カタカナを入力してくれたのでありがたかったです。
なのでもっぱらチャットをやっていましたね。思い出してみると。

さすがに見るに見かねた会員の方が、よかったらと、EPSON のワー
ドバンク・ノートにモデムカード (300/1200 bps) をつけたもの
を安く譲ってくださいました。それで NiftyServe のフォーラム
にもいくつか入会したようにおもいます。

# 当時は会員の方同士のこうした話が多かったですね。モデムを
# 新調すると古いものをおさがりで頂いたこともありますし (^^;
# BBS を運営していたホストにつなぐモデムに再利用されていた
# りしていました。

>> ただしさん

| フロッピーからカックン、カックン読み込んで今から思えば実に牧歌的な状
| 況でしたね。あの頃BYTE誌でしたか。BASICやアセンブラののコードが載ってましたが、配布フロッピーもないしインターネットでダウンロードなんて
| こともなく、ひたすらすら打ち込む忍耐勝負でしたね。

草の根 BBS につなげる前は本当に忍耐でしたね。

ただひたすらビシバシと機械語のダンプリストを眺めては打つ。

もう少し分かっていれば少しは苦痛も軽減できたのでしょうが、
基礎体力 (前提知識、計算機の技術的背景など) がまったくなく、
かつ基礎体力をつけなければならないという意識もなく行動もあ
りませんでしたからしょうがありません。

いまでもたまに思い出しては情けなかったなー、とおもうことが
あるのです。スクリーンサイズを変更する WIDTH コマンドのこと
なのですがご紹介しましょう。

スクリーンから WIDTH 80, 20 (リターン) と打つとスクリーンサ
イズが変更されるのですが、このコマンドの由来が width という
「幅」を意味する英単語と分かったのはすごくたってからで、当
時はまったくわかりませんでした。単に五つのアルファベットの
並びぐらいの理解しかしていませんでした。

そのため、いつも「ワイデュスティーエイチ」と口にしながら打
ち込んでいました。まったく意味不明な読み方 (発音以前の問題)
ですよね。

今でもふとしたときにそれを思い出すことがあって、これを口ず
さみながら「知らないって悲しいことだよな〜」と自分を戒めて
います。


| >このパソコンには特に印象がつよいです。というのも AIWA の 300/1200bps >のモデムをつないで地元の草の根 BBS につないだマシンだからです。
|
| そ、そーなんですよね。私はもっと低いレートのモデムカードを手に入
| れて試してみた。ソフトは何Termだったかしらないが登録されてるBBS
| を片っ端から繋ぎにいった。ピーヒャララ・ガラガラガラ・ブス、の連続。初めて受け入れてくれた遠く離れたBBSには感激しました。

まったく一緒です!

しかしその月の電話料金の高さに両親は「パソコン通信ってそん
なに電話代がかかるのか。」とため息をつきました。

| パソコン少年の生い立ちは大抵人様のコードをパクることから始まるんだ
| けど、いりやさんはえらいな。そんな頃から自分で通信ソフト書いちゃう
| なんて。私はあの頃からすっかり成長が止まっちゃっていまだにパクリ・
| 改造ばっかしで情けない。苦笑

いえいえ、わたしもアスキームックの「パソコン通信実践編」に
掲載された中屋広樹さんのターミナルプログラムをお手本にしま
した。これをベースにメモリ領域に書き込む処理を組み込んで何
とか電話代を減らす努力をしました。

外部記憶装置としてフロッピーディスクドライブが利用できれば
ファイル単位の読み書きを N80-BASIC からでもできたのですがわ
たしのテープ環境でうまい方法が思い当たらず、結局ユーザに解
放されているメモリ (N80-BASIC のプログラムや実行時のスタッ
ク領域など) をディスクがわりに使いました。番地は紙にメモし
ておいて、読み出すときはそれをてがかりにしていました。いま
おもうと原始的なファイルシステムですな〜。

>> 魔界の仮面弁士さん

[snip]
| A4の原稿1枚であっても、それをプリンタから出す為のプログラム作成に、
| 丸1日かけていました……我ながら、ずいぶん暇人だった物です。
| (そこまでして印刷するなら、最初から手で書いた方が絶対にはやいのに!)

執念。まさにこの一言に集約されるのではないかとおもいます!
すごいです。

            ★☆

ところで、草の根 BBS につなげたあの瞬間のことを書いてみて、
そういえば自分の進む方向にかなり影響を与えているよな〜とお
もいはじめました。

コンピュータベンダを選んだのもそうだし、仕事で通信業界に首
を突っ込んでいるのもそうだし、ネットワーク・プロトコルを面
白いと思うのもそうです。

いまや 300bps から 10Gbps に、ワイヤから光に、有線にくわえ
無線も入り、プロトコルも多種多様にはなってきましたが、相手
とつながったときの喜びは今も昔もかわらないからなんだとおも
います。

そういう意味では、これからも通信の世界にはずっと携わってい
たいですね。

おっとコーヒーが空になったようです。お邪魔しました!

いりや さん 2004年 03月 10日 01時 39分 13秒

木村さん、

うまくいってなによりです。WinXP を前提にしたスクリプトでしたので
木村さんの環境 (OS) ではそのままでは動かなかったようですね。すみ
ません。考慮がたりなくて。

run() メソッドに何をどう与えればよいのか、という話は Win32 API の
ShellExecuteA() など Windows シェルの提供するサービスについての
技術的な背景をおさえると見通しがよくなります。おてすきのときにしら
べてみてください。

木村 さん 2004年 03月 09日 22時 12分 13秒

cmd.exe /c では「指定されたファイルが見つかりません」とエラーが出てしまい、command.com /c としたところ無事動作しました。ただコマンドを書くだけではなくその前に入れるものがあるのですね。勉強になりました。ありがとうございました。

木村 さん 2004年 03月 09日 20時 08分 17秒

いりやさん

すみません。
ありがとうございました。
さっそく試してみたいと思います。

いりや さん 2004年 03月 09日 18時 44分 05秒

木村さん、

CACLS コマンドの前に cmd.exe /c をいれるとよいです。C オプショ
ンの意味はオンラインマニュアル (cmd.exe /?) によれば、

| /C    "文字列" に指定されたコマンドを実行した後、終了します。

だそうです。

DIR コマンドを使いたい場合は、

Set objWshShell = CreateObject("WScript.Shell")
objWshShell.Run "cmd.exe /c dir > c:\test.txt"
objWshShell.Run """c:\test.txt"""
Set objWshShell = Nothing

こんな感じです。

木村 さん 2004年 03月 09日 18時 20分 53秒

皆様はじめまして。木村と申します。
いつも参考にして頂いています。ありがとうございます。

とても初歩的な問題でつまずいております。
すみませんが、どなたかご教授いたでけないでしょうか。お願いいたします。

ShellオブジェクトのRunを使いCACLSコマンドを実行し、結果をテキストに吐き出そうとしていますがテキストが吐き出されず、つまずいております。
コードは以下の様にしております。

===========================
Set objWshShell = CreateObject("WScript.Shell")
objWshShell.Run "CACLS フォルダパス > c:\tmp.txt"
Set objWshShell = Nothing
==========================

コマンドプロンプトから直接"CACLS フォルダパス > c:\tmp.txt"を実行すると問題なくテキストに吐き出されるのですが、Runの書き方が違うのでしょうか。

objWshShell.Run """CACLS フォルダパス > c:\tmp.txt"""
Return = objWshShell.Run("CACLS フォルダパス > c:\tmp.txt",0,true)

などいろいろあがいてみましたがダメでした。

申し訳ないのですがどなたかご教授いただけたらお願いいたします。

ちぇ。 さん 2004年 03月 08日 14時 57分 13秒

都内どこでも移動するよぉ〜☆家は山の手線沿線です。とりあえず会って飲んだり遊んだりしたいなっ☆まぢですぐに会いたい。人恋しいのだよぉ〜(T〜T)ちぇは何だろう…外見は悪くないと思うし、今は年齢とか気にしないし。宜しくね☆あっそれと出来れば携帯からsakuramomoko45@yahoo.co.jpにメールください。http://q1.ne7.jp/t/servlet/p.jpg?i=383PUdAryEJ0 ←ちぇの画像だよぉ。

魔界の仮面弁士 さん 2004年 03月 06日 21時 24分 46秒

>>コーヒーブレイク

》 ひょん さん
> といっても親が好きで買ってきたのを、横から遊んでたんですけど。
我が家もほぼ同じ状況でした。(自分で買える金額ではありませんでしたし)

うちは東芝のPASOPIA(PA7012)という機種が最初です。小学3年生でしたね。
http://www.page.sannet.ne.jp/sasajima/pc/cata/toshiba.htm


カセットやフロッピーを買うお金は無いので、ゲーム等のソースコードを
私も良く打ち込んでいました。ただ、図書館にあったプログラミング本は、
残念ながらNEC系のBASICの物だけだったので、自宅で利用するためには、
東芝系のOA-BASICに翻訳しなければいけませんでしたが。

で。そのうち、そのパソコンで、町内会の回覧版とかをプリンタ出力する
だけのプログラムを書いていました。当時はワープロと呼ばれるソフトが
無かったので、印刷するためのプログラムも自作する必要があったのです。

さらに言えば、当時は [かな漢字変換]と呼ばれる物さえ無かったので、
漢字コードの一覧全てをプリントアウトしておき、それを眺めて
それぞれの漢字コードを調べ出す作業も必要で…。

『え〜と、この漢字は90B3で、これは……8C4Eで…次の漢字は……』
『この文字は、3段目の4桁目に印字して……改ページして……』
『この位置からこの位置に、LINE命令で直線を2本引いて……』

もう、非常に時間のかかる作業です。

A4の原稿1枚であっても、それをプリンタから出す為のプログラム作成に、
丸1日かけていました……我ながら、ずいぶん暇人だった物です。
(そこまでして印刷するなら、最初から手で書いた方が絶対にはやいのに!)

ただし さん 2004年 03月 06日 13時 11分 10秒

いりやさん、ひょんさん
>>コーヒーブレイク

私が最初に手に入れたのは、兄の会社でリース落ちした国民機PC98の初期
型でした。5インチフロッピーが二台付いてて一台がシステム用、もう一台
がデータ用になってました。あの頃はDBは桐とかFEPは(利益)管理工学研
究所の松茸とか今から思えば純和風でしたね。

フロッピーからカックン、カックン読み込んで今から思えば実に牧歌的な状
況でしたね。あの頃BYTE誌でしたか。BASICやアセンブラののコードが載ってましたが、配布フロッピーもないしインターネットでダウンロードなんて
こともなく、ひたすらすら打ち込む忍耐勝負でしたね。

文字が小さくて分かり辛かったな。私も手抜き考えてOCRも試してみたが、
あの頃は精度がひどくてバルタン星人語になっちゃいました。

外付けHD、確か20MB、付けたりして随分長いこと使ってました。中古屋に
持っていったら逆に引き取り料取られかけたりして泣けて来た。。

>このパソコンには特に印象がつよいです。というのも AIWA の 300/1200bps >のモデムをつないで地元の草の根 BBS につないだマシンだからです。

そ、そーなんですよね。私はもっと低いレートのモデムカードを手に入
れて試してみた。ソフトは何Termだったかしらないが登録されてるBBS
を片っ端から繋ぎにいった。ピーヒャララ・ガラガラガラ・ブス、の連続。初めて受け入れてくれた遠く離れたBBSには感激しました。

パソコン少年の生い立ちは大抵人様のコードをパクることから始まるんだ
けど、いりやさんはえらいな。そんな頃から自分で通信ソフト書いちゃう
なんて。私はあの頃からすっかり成長が止まっちゃっていまだにパクリ・
改造ばっかしで情けない。苦笑

ひょん さん 2004年 03月 05日 22時 51分 20秒

いりやさん
>>コーヒーブレイク

私も、中二の時、PC-8801 でした。
といっても親が好きで買ってきたのを、横から遊んでたんですけど。
BASIC は N88-BASIC で、new on 1 で N-BASIC にチェンジ・・・!
あの頃は、雑誌の打ち込み必死でしてましたね。
で、最近OCRでダンプ入力したり・・・。(手打ちの100倍早い?)

しかし、実に早期から通信をされてるんですね。
周りに通信してる人なんて誰もいませんでしたよ。

私が通信はじめたのは、9,600bps の頃で nifty でした。
(その頃の愛機はX68でしたが)

いゃ、年がばれるな〜

ひょん さん 2004年 03月 05日 22時 28分 53秒

ibara さん
>>┌シングルスレッド
>>└アパートメント
>> ├シングルスレッドアパートメント(STA)=アパートメントモデル(昔の表現
>> └マルチスレッドアパートメント(MTA)=フリースレッドモデル(昔の表現)

アパートメント は、STA (Single Threaded Apartment) を、
シングルスレッド は、プライマリSTA を指します。
ただし、これは VB だけの表現で、COM の書籍等では、これらの言い方はしていません。
(これが混乱をまねく...)

スレッディングモデルは2種類だけあります。
STA と MTA (Multi Threaded Apartment) です。

┌STA (さらに STA と プライマリSTA の2種)
└MTA (MTA, NA 等 / FTM)

NA(Neutral) と FTM はマーシャリングの最適化に関する動作の事で、
MTA に分類してもいいと思います。(NA は厳密には少し違うかも?!)

この2つのどちらかを使うかは、クライアント側が決めます。
そして、コンポーネント側は2つのモデルのうち、
どちらのモデルで使われるのが最適であるかを示します。(レジストリのThreadingModel)

ThreadingModel
 登録なし → プライマリSTA (第一STA とか、旧式コンポーネントとも言う)
 Apartment → STA
 Neutral  → NA
 Free   → MTA
 Both   → STA, MTA どちらもサポートする

たとえば、VB でクライアントを作り、そこで MTA コンポーネントを使ったとすると、
VB は シングルスレッド(STAクライアント)なので、
マルチスレッド対応に作られた MTAコンポーネントの
(非同期処理としての)パフォーマンスは発揮されません。
また、VCなどで MTA クライアントを作り、STA コンポーネントを使ったとしても、
STA コンポーネントは、同期処理を必要とするので、
マルチスレッドを使ったパフォーマンスは落ちるという事です。

いりや さん 2004年 03月 05日 19時 39分 12秒

ただしさん、

ちょっとコーヒーブレイク。。。

| NSBASICってあるんですか。私てっ
| きり昔昔のNBASICかと思いました。年ばれるかな。

ばれますね〜 :-)

わたしは両親にはじめて買ってもらったパソコンが NEC PC8001 MK2 でした。中学二年
生の頃です。ですから BASIC は N80-BASIC でした。たしか NEC PC8001 と同じ
N-BASIC も確かサポートしていたと思います。ビシバシ雑誌のソースコードや機械語の
ダンプを拡大印刷して打ち込んでいたのがなつかしい。

このパソコンには特に印象がつよいです。というのも AIWA の 300/1200bps のモデムを
つないで地元の草の根 BBS につないだマシンだからです。

300 bps/全二重, 8 bits, 1 stop-bit, NonParity, ANK (ASCII, 数字, 半角カタカナ!
全角漢字はなし!) 無手順、TERM コマンド (ログ取得なし) というような状況でしたが、
試行錯誤をへて、はじめて 80x24 のスクリーンに、BBS からの Welcome メッセージと
Login プロンプトがパラパラと表示されたときの感動はとても言葉では言えなません、
体中がビリビリと感動でしびれたのをよく覚えています。

それから、自作通信プログラムを作ってスタック領域をつぶさないよう受信データをメ
モリに書き込んだり、メッセージをメモリに残しておいて一気に送信させたりしてハッ
ピー通信ライフを送っていました。

あれから気づけば 18 年 (^^; ずいぶん自分を囲む環境も様変わりしましたね〜。

ibara さん 2004年 03月 05日 16時 27分 08秒

魔界の仮面弁士さん、何度もお付き合いいただきありがとうございます。

>Session_OnStartではなく、Application_OnStart の方が良いのでは。

>"MSXML2.FreeThreadedDOMDocument.4.0" ですが、

そうでした。単に書き間違いです。すみません。

>(あと、asyncプロパティはFalseに設定しておいた方が良いかと)

、ですね。

今日は色々とスレッドモデルに関する記事をMSのサイトで読んだのですが、
読めば読むほど混乱しています。

"アパートメント"という言葉は"シングルスレッド"と対比されるようです
(VBの設定でもそう)が、"シングルスレッドアパートメント"という
表現もあるところが最初の混乱です。
自分なりに整理すると、
-----------------------------------------------------------------
┌シングルスレッド
└アパートメント
 ├シングルスレッドアパートメント(STA)=アパートメントモデル(昔の表現
 └マルチスレッドアパートメント(MTA)=フリースレッドモデル(昔の表現)

BOTHモデル=STA+MTA+FTM
-----------------------------------------------------------------
ということ?ですか?
でもこれだとFreeThreadedDomDocumentがBOTHモデルだというのが???
http://www.microsoft.com/japan/msdn/columns/server/server01242000.asp
にも
"シングル スレッドのコンポーネントは使用しないでください。また ASP において
フリー スレッドのコンポーネントを使用することは避けてください。"
とあります。FreeThreadedDomDocumentの"FreeThreaded"という表現ではなく
レジストリの値を見なさい、ということでしょうか。


ああ、このあたりを図解で説明してくれているサイトか書籍はないのでしょうか?

魔界の仮面弁士 さん 2004年 03月 05日 16時 24分 11秒

# 手元にIE6しか無く、エラーの内容を確認できないため、
# 想像で回答しています。m(_ _)m


> .innerHTMLを使わずに動的にテキストを書き換えることは
テキストだったら、innerTextなのでは。


>  spTEST.innerHTML = "テスト"
spTESTへのアクセスが失敗しているのであれば、「spTEST」ではなく、
「document.getElementById('spTEST')」だと如何でしょう。
(getElementByIdは、IE5、NN6、Opera等でサポートされているようです)

spTESTは参照できるけれど、innerHTMLプロパティが失敗している場合は、
insertAdjacentHTML メソッドを使ってみてください。
  〜.insertAdjacentHTML('AfterBegin', 'テスト');

魔界の仮面弁士 さん 2004年 03月 05日 16時 00分 25秒

> global.asaのSession_OnStartで
> Set Application("Comp1") = Server.CreateObject("ComponentID")
Session_OnStartではなく、Application_OnStart の方が良いのでは。
(まぁ、いずれにしても格納はできませんけれどね…)

> のようにした場合は登録できました。
確かにIIS5では、<OBJECT>タグを使えばApplication変数にする事が
できますが、下記にも書かれていますように、おすすめはできません。
http://www.microsoft.com/japan/msdn/web/server/asp/asptips.asp


> 両者の違いがよく分かりません。
前者は動的、後者は静的なコレクションとなっています。
WSCから見た場合でいえば、前者の記述には、
  Scriptlet.Application.Contents("Comp1")
でアクセスする事になり、後者は
  Scriptlet.Application.StaticObjects("Comp1")
となります。

これらにCOMオブジェクトを格納する場合は、いずれの記述方法であっても、
フリースレッドマーシャラを集成する、“Bothとしてマークされた
オブジェクト”を格納する事が推奨されています。

アパートメントスレッドの場合、前者(Application.Contents)では、
格納させる事はできません。(既に試されたように、エラーとなります)
後者(<OBJECT>タグを使用した場合)は、アパートメントスレッドの
オブジェクトも格納できますが、パフォーマンスに難があるというのは
前述の通りです。

> こんな感じにしとけばよいのかな?
"MSXML2.FreeThreadedDOMDocument40" ではなく、
"MSXML2.FreeThreadedDOMDocument.4.0" ですが、
考え方は、おそらくそれで大丈夫だと思います。
(あと、asyncプロパティはFalseに設定しておいた方が良いかと)

"MSXML2.FreeThreadedDOMDocument.4.0" は、"Both"モデルなので、
Applicationオブジェクトにキャッシュさせる事ができます。

# このオブジェクトのスレッドモデルについては、レジストリの
#   HKEY_CLASSES_ROOT\CLSID\{88D969C0-F192-11D4-A65F-0040963251E5}\InProcServer32\ThreadingModel
# に書かれている値にて確認できます。

風間 さん 2004年 03月 05日 11時 33分 08秒

はじめまして
今NNで困っています
今までIEだけで動かしていたHPをNNで見たら
下記の場所がどうもうまいこと動きません

[HTML側]
<SPAN id=spTEST></SAPN>

[JavaScript側]
  spTEST.innerHTML = "テスト"

.innerHTMLを使わずに動的にテキストを書き換えることは
可能なんでしょうか?
よろしくお願い致しますm(__)m

ibara さん 2004年 03月 05日 10時 01分 20秒

魔界の仮面弁士さん、ひょんさん、ありがとうございます。

> そして(既に試されていたなら、お気づきかも知れませんが)、
> アパートメントである以上、そのオブジェクトをApplication変数として
> 保持させる事はできません。

global.asaのSession_OnStartで
Set Application("Comp1") = Server.CreateObject("ComponentID")
とすると、
"アパートメント モデルの動作を持つオブジェクトを Application 固有オブジェクトに追加できません。"
というエラーになりました。

<OBJECT RUNAT=Server SCOPE=Application ID=Comp1 PROGID="ComponentID"></OBJECT>
のようにした場合は登録できました。両者の違いがよく分かりません。


結局私のしたいことをするには、
global.asa--------------------------
Set Application("SomeDocument") = Server.CreateObject("MSXML2.FreeThreadedDOMDocument40")
Application("SomeDocument").load "hoge.xml"

inc.asp-----------------------------
Function SomeFunc(arg1)
Application("SomeDocument").Hogehoge...

hogehoge.asp------------------------
a = SomeFunc(arg1)

こんな感じにしとけばよいのかな?

魔界の仮面弁士 さん 2004年 03月 04日 20時 25分 32秒

ひょんさん、御指摘ありがとうございます。

ひょんさんが書いてくださったように、WSC自体は、
シングルスレッドアパートメントモデルとなります。

そして(既に試されていたなら、お気づきかも知れませんが)、
アパートメントである以上、そのオブジェクトをApplication変数として
保持させる事はできません。

なので今回の場合は、先に書いた FreeThreadedDOMDocument を使って、
XMLだけを保持させるようにしてみてください。WSCからは、それを
Scriptlet.Application.Contents() を使って参照する事ができます。

# WSCと同様、"Microsoft.XMLDOM" や "MSXML2.DOMDocument" なども
# Applicationに格納させる事ができません。

ひょん さん 2004年 03月 04日 17時 59分 28秒

WSCコンポーネント自体が STA なので、
その内部で使うコンポーネントがたとえ Free Threaded model であるかに
関らず wscとのやりとりでパフォーマンスは落ちますね。

魔界の仮面弁士 さん 2004年 03月 04日 16時 49分 58秒

> MSXMLを使用しています;
> 困ったな・・・。
どのバージョンをお使いですか? ("Microsoft.XMLDOM"などでは無いですよね?)
最近のバージョンであれば、Rental-Threadedモデルとは別に、
FreeThreadedなモデルが用意されていますので、そちらを使えば大丈夫です。
例えば、"Msxml2.FreeThreadedDOMDocument.4.0" などですね。
http://www.microsoft.com/downloads/details.aspx?FamilyID=3144b72b-b4f2-46da-b4b6-c5d7485f2b42&DisplayLang=ja

なおASP(サーバサイドスクリプト)ではなく、HTMLコンポーネント
(クライアントサイドスクリプト)での利用であれば、動作の軽い
"Msxml2.DOMDocument.4.0"の方を使われても、問題はありません。

> 処理が直列化されるため
例えば、DictionaryやXMLの内容が変更されている最中に、他のセッションから、
その値が参照された場合、問題が発生しますよね。
Application.Lockなどの機構は、それを制御するための物ですが、
Lockしている間は、他のセッションからの要求は「待ち状態」になります。
これが『処理の直列化』、ひいてはパフォーマンスの低下に繋がるわけです。

ibara さん 2004年 03月 04日 15時 09分 19秒

魔界の仮面弁士さん、

>WSC内部で、他のCOMコンポーネントを使用していますか?

MSXMLを使用しています;
困ったな・・・。
設定的なものをXMLファイルで作成しておき、この中身を参照したいのです。
さらにASP側でDOMのAPIを触らせるのもなんなので、要素の値取得メソッドをもつコンポーネントを作ろうかと考えてました。
ページを要求するたびにXMLをパースしたのでは実用に耐えないだろうとということでこんな作りになってるんですが・・・。
根本的に間違ってるでしょうか

教えていただいたMicrosoftのページが言っているのは、例えばScripting.Dictionaryなどをアプリケーションスコープに置いた場合、処理が直列化されるため、複数のセッションから要求があった場合にパフォーマンスが悪化するという意味でしょうか。Windowsのスレッド?の考え方は不勉強なため、アパートメント云々というのがよく分かりませんでした。勉強します。

いりやさん。
ありがとうございます。今から見てみます。

いりや さん 2004年 03月 04日 13時 26分 33秒

ibara さん、魔界の仮面弁士さん、

しきさんのスクリプトコンポーネント SkScript を参考になさっては
いかがでしょうか。
http://www.tees.ne.jp/~rdat32lp/script/script.html

魔界の仮面弁士 さん 2004年 03月 04日 13時 07分 25秒

> ・ASP全体で使用するオブジェクトがひとつだけほしい。
状態を保持しない(例えばメソッドのみで、プロパティを持たないような)
オブジェクトであれば、ASPのinclude処理命令で代用できると思います。

あるいは、ビジネスロジックをGlobalMultiUseなCOMコンポーネントに
カプセル化し、それをGlobal.asaで参照設定するという手法もあります。

> ひょっとしてこのコンポーネントの生成時ですか?
そうなります。ちなみに、JScriptの場合も同様です。

> Applicationスコープのオブジェクトとして宣言しようと考えました。
WSC内部で、他のCOMコンポーネントを使用していますか?
使用していないのなら構わないのですが、もし使用しているのであれば、
http://www.microsoft.com/japan/msdn/columns/server/server03272000.asp
を参考にして、それが「Applicationに指定しても、パフォーマンスに問題が無いか」を
十分に検討する事をおすすめします。

ibara さん 2004年 03月 04日 12時 26分 46秒

魔界の仮面弁士 さん、ありがとうございます。

やりたいことはこんな感じの事です。
・ASP全体で使用するオブジェクトがひとつだけほしい。
JavaならSingletonでよいのですが、VBScriptでは無理そうなので、
ScriptComponentを作成し、これをglobal.asaでApplicationスコープ
のオブジェクトとして宣言しようと考えました。

・このコンポーネントはいくつかの別のオブジェクを所有します。
前回の書き込みの名前で行けばcomponent1 has a component 2です。
(今考えるとこのcomponent2,3,4は別にClassでよかったかも)
で、このcomponent2,3,4の生成と初期化処理を、component1のメソッド
呼び出しのたびに行うのも無駄なので、できればcomponent1の生成時
に1度だけやっておきたいな、と


ここ1年触ってない怪しいJavaで書くとこんな感じのことがしたいのです

Servlet, JSPなど------
Component comp1 = Component1.getInstance();
comp1.なにかの処理();
:

Component1------------
public class Component1{

private Component2 comp2;
private Component3 comp3;
//Singleton
public static synchronized Component1 getInstance(){
:
}*

private Component1(){
this.comp2 = new Component2();
this.comp3 = new Component3();
comp2.何かの初期化();//生成するだけでなく、いくつかしたいこともある。
comp3.何かの初期化();
}

public void 何かの処理(){
//ここで毎回comp2を生成はしたくない。
comp2.ああだこうだ();
comp3.どうのこうの();
}
}

---------------

で、ASPでComponent1をCreateObject()で生成したときに内部的には
component2,component3を生成し、初期化処理をしておきたいのだけれど、
それを行う手段がよく分かりませんでした。
魔界の仮面弁士 さんのソースではscriptタグの直後に
Dim oComponent
Set oComponent = New CDBComponent
という記述がありますが、ここに書いてある処理はいつ呼ばれるもの
なのでしょうか。ひょっとしてこのコンポーネントの生成時ですか?
ならばここでcomponent2,3,4を生成して初期化処理を呼べば解決です。
Windows script componentのサンプルではどれもここの部分には変数を
宣言するだけでステートメントを書いてあるものはなかったし、Javaでも
こんなところには書けないので頭から無理と決め付けていたのですが。



魔界の仮面弁士 さん 2004年 03月 04日 11時 10分 20秒

> Windows Script Componentを使っているのですが、
> これにはコンストラクタ(という概念がVBScriptにあるのか
> 知らないのですが)に相当するものはあるのでしょうか。
VB/VBA/VBScriptには、Constructorの概念はありません。

VB.NETでいうところのコンストラクタに近い物としては、
Class の Initialize イベントがありますが、これだと
引数を定義する事ができないのが難点ですね。


> これに相当するものがあるのかどうかがよく分かりませんでした。
大丈夫です、Classを定義すれば、Initializeイベントは起きますよ。

Windows Script Componentsにしても、HTML Componentsにしても、
結局は、VBScript(などのスクリプト言語)を呼び出しているだけなので、
VBScript自身が持つ機能は、すべて利用できます。

ただしClass_Initilazeは、Class定義されたオブジェクトの生成時に
呼ばれる物であって、createComponent自体の呼び出しとは無関係です。
無理に関連付けるとするなら、こんな感じでしょうか。

=================
<?xml version="1.0" encoding="UTF-8"?><package>
<component id="Orator.Sample34"><?componet error="true" debug="true"?>
<registration
progid="Orator.Sample34"
classid="{F0470F68-59C4-4e42-BF65-EE6DBFC078B4}"
version="1"
/>
<implements type="ASP" id="oASP" />
<public>
<method name="Execute">
<parameter name="SQL" />
</method>
<method name="ExecuteReader">
<parameter name="SQL" />
</method>
<method name="Commit" />
<method name="Rollback" />
</public>
<script language="VBScript"><![CDATA[Option Explicit
Dim oComponent
Set oComponent = New CDBComponent

Class CDBComponent
'
'
Private Sub Class_Initialize()
'
End Sub
Public Function Execute(ByVal SQL)
'
End Function
Public Function ExecuteReader(ByVal SQL)
'
End Function
Public Sub Commit()
'
End Sub
Public Sub Rollback()
'
End Sub
End Class

Public Function Execute(ByVal SQL)
Execute = oComponent.Execute(SQL)
End Function
Public Function ExecuteReader(ByVal SQL)
Set ExecuteReader = oComponent.Execute(SQL)
End Function
Public Sub Commit()
oComponent.Commit
End Function
Public Function Rollback()
oComponent.Rollback
End Function

']]></script>

</component>

</package>
=================



> そこでコンストラクタがあればそこでcomponent2,3,4
> をcreateComponent()すればよいと考えたのですが・・・。
コンストラクタが無くても、createComponentを使う事はできるのでは。

ibara さん 2004年 03月 04日 09時 35分 07秒

はじめまして。いつも参考にさせていただいています。
Windows Script Componentを使っているのですが、
これにはコンストラクタ(という概念がVBScriptにあるのか
知らないのですが)に相当するものはあるのでしょうか。
VBScriptでClassを作ったときはPrivate Sub Class_Initialize()を
定義していたのですが、これに相当するものがあるのかどうかが
よく分かりませんでした。

やりたいことは、ひとつのWSCファイルにcomponent1,2,3,4を定義し、
component1のメンバーとしてcompoent2,3,4を持たせる
ことです。そこでコンストラクタがあればそこでcomponent2,3,4
をcreateComponent()すればよいと考えたのですが・・・。

Return