出来るのだASP Q&A掲示板(過去LOG)  訪問数 52046 昨日 889 今日 776
    【PR】 パソコン入門からIT専門書まで幅広く取り揃えています。セブン-イレブン受取り手数料無料のセブンアンドワイ。
Topに戻る 掲示板に戻る 検索 削除 管理者

DLL内からSessionを読み書き可能?   北岳さん [2002/01/13 0:28:42] [1382]
  発言者により削除されました!! 北岳さん [2002/01/13 3:20:19] [1383]
  無理みたい   北岳さん [2002/01/13 11:23:25] [1384]
    Re:無理みたい   Tomitomiさん [2002/01/13 12:57:45] [1385]
      Re:無理みたい   北岳さん [2002/01/13 18:50:12] [1386]
  できるようですけど?   喜平さん [2002/01/15 1:18:34] [1387]
    Re:できるようですけど?   北岳さん [2002/01/15 19:17:32] [1404]
      こんな感じで・・・一番単純なサンプルです   喜平さん [2002/01/16 8:47:17] [1405]
        ありがとうございます。できました。   北岳さん [2002/01/16 12:32:37] [1409]
          スペルミス   北岳さん [2002/01/16 13:28:00] [1411]

[1382] DLL内からSessionを読み書き可能?
投稿者:北岳さん 2002/01/13 0:28:42
ASPがらみのVB(ver5)で質問致します。
 
------(現ASP)--------
<%

x=Session.Contents("a")

Session.Contents("b")=yy

%>
----------------------
 
というVBScriptの ASPを、高速化を狙って、そっくりVBで書き直しDLLにしてしまい、
ASPの方は(SessionをDLL内から呼ぶことで、引数も戻り値も不要となる筈ですが)
関数を呼出して、
 
------(ASP側)--------
<%
set obj=Server.CreateObject("Proj1.Cls1")
z=obj.func()
%>
----------------------
 
で片付けたいのですが、VB5のcls内に書くべき
■SessionオブジェクトのProgID が判りません。
 
regeditで探し出した、それらしいキー「ASP Session Object」の項を見ると、
ここの CLSIDは
HKEY_CLASSES_ROOT\CLSID\{D97A6DA0-A865-11cf-83AF-00A0C90C2BD8}
となっていました。が、その番号の項目にも ProgIDが書かれていませんでした。
(自宅WIN98+PWSのASP使用マシンにて。会社のNT4+IISは見ていません。)
 
------(VB側)--------
Public Function Cls1(dummy as variant) as variant

set ss=CreateObject("?")
x=ss.Contents("a")

ss.Contents("b")=yy

end function
----------------------
の?の行は、こういう場合はどう書けばよろしいのでしょうか。
 
VBヘルプと VB-BooksOnLineでは判りませんでした。
Sessionを読み書きする場合だけASPで行うなら、〜を3つのメソドに分ければ可能ですが、
DLL内でSessionに直接アクセスできれば、ASP〜DLL間でvariant戻り値⇒配列等の変換をしなくて済み、
今後のASP側記述がとても楽になる、と目論んでいます。

[1383] どうやら無理のようでした。
投稿者:北岳さん 2002/01/13 3:20:19
発言者により削除されました!!

[1384] 無理みたい
投稿者:北岳さん 2002/01/13 11:23:25
regeditで、BASP21を真似して
 ProgID:(標準)"kitadakesession.1"
 Programmable:(値の設定なし)
 VersionIndependentProgID:(標準)"kitadakesession"
を書き込んでみました。

----DLLソース---------
Public Function KtSession(dummy As Variant) As Variant
Dim ss
Set ss = CreateObject("kitadakesession.1") '(*)
ss.Contents("fuji") = "富士" '(**)
KtSession = "槍"
End Function

---ASP----------
<%
dim kobj
set kobj=Server.CreateObject("Proj1.Cls1")
dummy=1
ret=kobj.KtSession(dummy) 'エラー発生行
response.write "<br>" & ret '槍を得たい
response.write "<br>" & Session.Contents("fuji") '富士を得たい
%>
-----------------
 
結果:
「5行目 エラー '800a01ad'
 ActiveX コンポーネントはオブジェクトを作成できません。 」
でした。
ss.Session.Contents("fuji") = "富士" でも同じ。
念のため '(*)(**)をコメントアウトしたら、ASP画面に「槍」は表示されました。
 
(DLLをやめフォームモジュールで実行させると、(*)で 同じエラーが発生。
VB単独、ASPが動いていないので、こちらは当然に思えます。)
 
(愚痴)何かやるたびにマシンをリブート。ASPから呼ぶDLLって、厄介ですねえ。

[1385] Re:無理みたい
投稿者:Tomitomiさん 2002/01/13 12:57:45
こんにちは、Tomitomiです。

> (愚痴)何かやるたびにマシンをリブート。ASPから呼ぶDLLって、厄介ですねえ。

動くまでが、厄介です。w
動けばあとは、DLLをライブラリとして持てば使い勝手いいのですがね。。
ひとつ、VBからセッション等をなんとかするのは全然わからないのですが、
ASPでCallしたものは、ユーザがすべて「User」だったかな?。になります。
これは、DLLもBasp21でexeをキックしても、いっしょです。
とりあえず、情報として。。

[1386] Re:無理みたい
投稿者:北岳さん 2002/01/13 18:50:12
レスありがとうございます。
 
>動けばあとは、DLLをライブラリとして持てば使い勝手いいのですがね。。
incと違い DLLは1つでよいし、これは実感しています。
 
ところでDLL内でSession を CreateObjectしても、クライアントの情報をDLL側に伝えない限り、読み書きする先が不明でした。
ユーザの情報が必要ですが、仮に環境変数などから得ても、渡し方が??
tomitomiさんご教示のUSER?も、いずれ調べたいと思っています。
 
WEBではこれら情報を探せませんでしたので、最初に戻りまして・・・
SessionをDLL内から呼びたい理由は、DLLの戻り値が配列のときにASPで
for each c in 戻り値
のように「解凍」するのがかったるいため。
で、当面はその都度ASP側でカッタルイことをして逃げることにします。

[1387] できるようですけど?
投稿者:喜平さん 2002/01/15 1:18:34
vb6 のwebclass が自動的に作るasp を見れば、ヒントになると思いますが・・・
いってしまえば、単に、activex dll のメソッドにsession を
渡せば、利用可能です。他のasp組み込みオブジェクトも
同様です。
 詳しくは、vb magazine 2000/7 月号を読んでください。

ちなみに、session オブジェクトは、コンポーネントの一部
ですので、ProgID など存在しません。
 VB で参照するならば、参照設定で・・・
asp.dll を登録するか、
Microsoft Active Server Pages Object Library
をリストから探してチェックすればよいです。



[1404] Re:できるようですけど?
投稿者:北岳さん 2002/01/15 19:17:32
ありがとうございます。折角のご情報ながら、うまく行きませんでした。
ご紹介のVB6と雑誌がないまま、NT4本番サーバをバックアップしているWIN2000端末でやりました。
VB5の参照設定で Microsoft Active Server Pages Object Library を登録して
(後述★の意図に沿いそうな)コードを書いてみましたら、最初は
「オブジェクトが見つかりません」でした。
 
----雑談始め---
で、レジストリのASP Server Object にProgIdを命名するといういたずらを再度しましたら、
IISが死んでしまって、停止再稼動しても、今のところ生き返りません。
HTMは開けてもASPは動かないという、8002801dエラー。 http://www.iisfaq.com/Articles/219/
まあ、本番サーバでなかったのが幸いでした。
で、ほかにまだ2台が生きていますので、死んだ者は当分放っぽっておきまして、
----雑談終り---
 
> いってしまえば、単に、activex dll のメソッドにsession を
> 渡せば、利用可能です。
 
とは、DLLからSession変数の数の分だけPublic変数を得る、ということでしょうか。
 
Session変数の中身を引数にして与え、戻り値を改めてSession変数に入れ直せば、
DLL内からSessionオブジェクトを呼ぶ必要はなくなり、普通のDLLで作れますが、
 
★やりたいこと:
実は複数の配列変数を多数のSession変数に入れています。
DLLには、引数として(与えるにしてもSession.SessionID 以外は)何も与えず、
戻り値も何も貰わず、
DLL内部でASPのSession変数を読みこみ、それを元に計算等の処理をしてDLL内でSession変数を書き換え、
ASPからDLLを呼んだ前と後で、Session変数の中身が、
---ASPから見ればいつの間にか---
書き換わっている、
DLL自体は操作だけ行い、ASPに戻り値・メソッドの類は何も返さない、
ということは、可能そうでしょうか。

[1405] こんな感じで・・・一番単純なサンプルです
投稿者:喜平さん 2002/01/16 8:47:17
<% Option Explicit %>
<!--#INCLUDE virtual="/include/lib.asp"-->
<%
DIM ASPObjectTest
Set ASPObjectTest = Server.CreateObject("ASPObjectTest.Class1")

Session("test")=1
resbr Session("test")
ASPObjectTest.test1 session
resbr Session("test")

%>

---------- activex dll --------
Dim mSession As Object

Public Sub test1(Session1 As Object)
Set mSession = Session1
mSession("test") = "test"
End Sub





[1409] ありがとうございます。できました。
投稿者:北岳さん 2002/01/16 12:32:37
喜平さん、ありがとうございました。
aspを少し手直ししまして:
INCLUDE virtual="/include/lib.asp"を削除、
resbr を削除
しまして、所望のDLLが得られました。
 
Sessionコレクションをまとめて渡せたのですね。
これをヒントに、ASP側で
for each c in Session.Contents
response.write "<br>" & Session.Contents(c)
next
とやったら、こちらも使えました。
 
なおDLL内で新たに作ったSession変数はうまく扱えなかったのですが、ASP側で変数名だけ用意することで、解決しました。
 
これで、今まで作ったASPを殆ど書き換えずにVBに移しDLL化しても、
Session の中身を次のASPに渡せそうです。
大変感謝です。
---------------------------------------------
(追伸)
昨日レジストリをegeditでいたずらしたら、IISが死んだと思いました。
昨日はegeditで元に戻しても直らなかったのですが、
帰宅途上で、「HTMは開くので、死んだのはASPだけ」と思いつきました。
今朝DOS窓からredsvr32 経由でasp.dllを 再登録したら、息を吹き返しました。
 
結局、死んだと思ったのは早とちりでした。
一晩気を失っていただけ・・・

[1411] スペルミス
投稿者:北岳さん 2002/01/16 13:28:00
訂正します。
> 昨日レジストリをegeditでいたずらしたら、
⇒regedit
> 今朝DOS窓からredsvr32 経由でasp.dllを 再登録したら、
⇒regsvr32



TreeBBS For ASP V.0.1.3
Program By YasNet