ASP FAQ

ASPのデバッグ Edit

ローカルの IIS で ASP サイトを動かしている場合う、Visual InterDev または Microsoft Script Debugger で ASP のデバッグができます。

「Webサイトのプロパティ」→「構成」→「ASPのサーバー側のデバッグを有効にする」にチェックをつけます。

以後、ブラウザでエラーのあるASPにアクセスすると、「デバッグしますか?」というダイアログが出て、選択したデバッガでデバッグできるようになります。


IIS_debug.GIF

たまに原因不明でデバッグできないこともあるようです。

http://q.hatena.ne.jp/1144037030

ASP ページをデバッグするための VBScript クラスまたは JScript オブジェクトを作成する方法 Edit

http://support.microsoft.com/kb/288965/ja

ASPでOracleに接続するときの注意点 Edit

ASP で、ORACLE との連携を行うときに、注意すべき点を挙げておきます。

http://www.interq.or.jp/www-user/komurak/iis/oracle/

soXXX(StaticObject)について Edit

EXXX-XxxxのASPに出てくるsoXXXという名前の変数は、global.asaで次のようにして宣言しています。

<OBJECT RUNAT=Server SCOPE=Session ID=xxxxxx PROGID="xxx.yyy">
</OBJECT>

ASPでxxxxxxという変数名で最初にアクセスしたときにIISが自動的にクラスxxx.yyyを作成し、ASPに渡します。

SCOPE=Sessionと書いてあるので、そのオブジェクトはセッションが切断されるまで存続し、

それ以降ASPから要求があったときは、さっき作ったxxx.yyyのオブジェクトを渡します。

参考:

Application StaticObjects コレクション

http://www.microsoft.com/windows/windows2000/ja/advanced/iis/htm/asp/vbob5uem.htm

Application オブジェクト

http://www.microsoft.com/windows/windows2000/ja/advanced/iis/htm/asp/vbob8zw4.htm

サーバサイドインクルード(SSI) Edit

<!-- #Include file="../common/SessionCheck.asp" -->

これをサーバサイドインクルードといいます。

これはIISの機能であり、HTMLの仕様ではありません(だからHTMLのコメントの中に含めている)。

Apacheにも同じSSIの機能があります。



SSIには

<!-- #Include file="header.txt" -->

<!-- #Include virtual="hoge/moge/header.txt" -->

という2種類の方法があり、違いはファイルのパスを絶対パスで指定するか相対パスで指定するかだけです(たぶん)。



注意:

IISはアクセスされたASPをコンパイルしてキャッシュしておく機能があります。

要求されたASPのタイムスタンプと前回アクセスされた時間を比較し、前回からファイルが更新されていないならキャッシュを使います。

しかし、A.aspがB.aspをインクルードしているとして、

  1. A.aspにアクセス(→キャッシュされる)
  2. B.aspを変更
  3. A.aspにアクセス(→A.aspのタイムスタンプは変わっていないのでキャッシュが使われる。B.aspの変更は反映されない!

ということが起こるので注意です。

この場合はA.aspのタイムスタンプを更新する、それでもだめならIISを再起動してみましょう。

Application.Lock Edit

アプリケーション変数を更新するときは、排他のために必ず Application.Lock を行います。

しかし Application.Lock を呼んだだけではロックされず、次にアプリケーション変数にアクセスしたときにはじめてロックされるという少し奇妙な仕様なので注意。

> Application.Lock()
>  <排他したい処理(一意のID発行など)>
> Application.UnLock()

これだけだとロックかからなかったはずですね。
Lockの後にアプリケーション変数にアクセスしにいったときにはじめてロックされたはずです。
なので、ダミーのアプリケーション変数を一つつくって、そこに何か適当な値でもいれてみたらいいんじゃないでしょうか。
このあたりの動作はASPでも同じように動いていたと思います。 

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=26090

Application.Lock
ここ←
ファイル操作
Application.UnLock

上記「ここ」の所で、アプリケーション変数(ダミーでかまわない)に何か値を代入してやると、結果としてファイルに対しての排他制御ができます。

http://tryasp.winscom.co.jp/wbbs_qa.asp?TBL=W4_ASP_QA&CATE=&MODE=L_PARENT&NO=65590&CTL_DISP=GROUP&CTL_NO=65512

COM(ActiveX)DLLの作り方 Edit

ASP関連(VisualBasic6.0によるActiveX.DLLの利用)

http://www.asahi-net.or.jp/~ef2o-inue/asp/sub12_05.html

ASPからコールするCOMコンポーネント:.knowledge - frog.raindrop.jp

http://frog.raindrop.jp/knowledge/archives/000111.html

ActiveX コンポーネントで作成されるレジストリ エントリ Edit

regsvr32 で DLL を登録したとき、レジストリのどこに DLL のパスが書き込まれるのか

疑問に思ったことはないでしょうか?

次の記事がその疑問に答えてくれます。

ActiveX コンポーネントで作成されるレジストリ エントリ

http://support.microsoft.com/kb/183771/ja

CreateObject の速度 Edit

CreateObject 自体はけっこう速いようです。

次の VBScript を time.vbs として保存して実行すると、

Pentium(R) 4 CPU 3.00GZHz
1.00 GB RAM

の環境で

100回
23秒
0.23 秒/回

という結果になりました。

しかし、CSystemInfo は Initialize の中で ini ファイル読み込みなどもしているので、

純粋に CreateObject だけの時間ではありません。

SysService.CSystemInfo でなく EventService.CSchedule などに変えると、

1回あたりほとんど0秒で生成できました。

Dim a
a = Now()

Dim Count
Count = 100

For i = 1 To Count 
	Set oSys = CreateObject("SysService.CSystemInfo")
	Set oSys = Nothing
Next

Dim b
b = Now()

Dim diff
diff = (b - a) * 24*60*60

MsgBox Count & " 回" & vbNewLine & _
       Round(diff, 6) & " 秒" & vbNewLine & _
	   Round(diff/Count, 6) & " 秒/回" 

    Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes