比如我的ASP中如
<%Set tests=Server.CreateObject("dllname.tests")
dim bb
bb="avf"tests.test()
%>
而在DLL中有个要用到这个变量bb的sub test()
response.write "test:" & bb
end sub当执行那个ASP时,得不到结果,只显示出test:就没了。
如何将ASP的变量传递到DLL中执行?
别建议用SESSION\COOKIE之类的哦。也别建议用test (str)这样来传递,因为有很多个变量。

解决方案 »

  1.   

    那你的类文件(DLL)中的方法得要有参数啊sub test(byval bb)
    response.write "test:" & bb
    end sub另外,好象如果这些类文件供ASP调用的话,
    DLL中不能声明具体变量类型,只能是variant的
    这个仅是有这样的印象,不是特别肯定
      

  2.   

    dll 中定义变量 public bb<%
    Set tests=Server.CreateObject("dllname.tests")
    dim bb
    tests.bb="avf"
    tests.test()
    %>
      

  3.   

    asp
    <%
    Set tests=Server.CreateObject("dllname.tests")
    response.write(tests.test("aa"))
    %>dll
    public function test(byval strinput as string)
    test = "test:" & strinput
    end function
      

  4.   

    楼上的哥们,我文章里都说了,别用test (str)这样来传递,因为有很多个变量,而且变量数不固定。
    并且我发现发过来,DLL的变量也无法传递到ASP中。
    那么反过来,DLL的变量如何传递给ASP呢?
    比如我的ASP中如
    <%Set tests=Server.CreateObject("dllname.tests")
    tests.test()
    response.write bb
    %>
    而在DLL中有个要用到这个变量bb的sub test()
    dim bb
    bb="abc"
    end sub当执行那个ASP时,得不到结果.
    也是很多个变量,难道要一个变量写一个FUNCTION或者SUB啊?
      

  5.   

    asp
    <%
    Set tests=Server.CreateObject("dllname.tests")
    test.sharevar = "aa"
    response.write(tests.test("aa"))
    response.write("<br />" & test.sharevar
    %>
    dll
    public sharevar as string
    public function test(byval strinput as string)
    sharevar = strinput & strinput
    test = "test:" & strinput
    end function不定数量变量可以用数组、集合。
      

  6.   

    这个我知道,我就是不想用test("aa")这样的方法。能否举例一个用数组的?
    那么反过来,DLL的变量如何传递给ASP呢?
    比如我的ASP中如
    <%Set tests=Server.CreateObject("dllname.tests")
    tests.test()
    response.write bb
    %>
    而在DLL中有个要用到这个变量bb的sub test()
    dim bb
    bb="abc"
    end sub当执行那个ASP时,得不到结果.
    也是很多个变量,难道要一个变量写一个FUNCTION或者SUB?
      

  7.   

    我想说下我想做具体什么功能吧?
    我想在DLL里做一个检查用户级别的子程序或者函数
    每个用户表USERS里有个字段是用户级别,假设为userLevel,如果userlevel=100则为管理员,如果=90则为总版主,如果=80则为版主,如果=70则为普通用户。如果小于50则为冻结的用户。
    通过用户的ID来查询出USERLEVEL。
    以前在ASP里我这样做
    <%
    sub ckuser(id)
    dim isadmin, isbbsadmin, ismod, isuser,isfreeze,sql
    sql="select userlevel from users where id="&id
    set rs=conn.execute (sql)
    if rs("userlevel")=100 then isadmin=ture
    if rs("userlevel")=90 then isBbsadmin=true
    if rs("userlevel")=80 then isMod=ture
    if rs("userlevel")=70 then isUser=true
    if rs("userlevel")<50 then  isFreeze=true
    end sub
    ckuser(22)
    if isadmin then 
    ..... '这里执行一系列动作
    else
    response.write "你没权限操作"
    end if
    %>这个在ASP中可以执行。可是如果把这个SUB搬去DLL里,在ASP中如下执行则获不到isadmin的值<%
    Set tests=Server.CreateObject("classname.testsubs")
    tests.ckuser(22)
    if isadmin then 
    ..... '这里执行一系列动作
    else
    response.write "你没权限操作"
    end if
    %>这样的结果会是“你没权限操作”
    请问如何返回正确的isAdmin等的变量呢?当然,我想过用FUNCTION CKUSER(UID),直接返回USERLEVEL的值,但是这样我原有的大量的ASP代码都要修改了。
    也想过直接把USERLEVEL保存进SESSION中,可是如果用户量很大的时候,太多SESSION会导致服务器负荷大。
    也想过用COOKIE,但是COOKIE不稳定,有的用户反应无法登陆,获取不到COOKIE的值,同时COOKIE做身份认证也不安全。当然,还可以把这个SUB直接用在ASP中,可是用户量太大的话,性能没DLL的好。
      

  8.   

    dll里面
    public isadmin, isbbsadmin, ismod, isuser,isfreeze,sql
    sub ckuser(id)
    sql="select userlevel from users where id="&id
    set rs=conn.execute (sql)
    if rs("userlevel")=100 then isadmin=ture
    if rs("userlevel")=90 then isBbsadmin=true
    if rs("userlevel")=80 then isMod=ture
    if rs("userlevel")=70 then isUser=true
    if rs("userlevel")<50 then isFreeze=true
    end subasp里面
    tests.ckuser(22)
    if tests.isadmin then  
    ..... '这里执行一系列动作
    else
    response.write "你没权限操作"
    end if
    这是最简单的改法。不过个人觉得,你最好先学习下Basic语法,然后把你的程序推倒从来。这代码实在不好说。
      

  9.   

    学习编程序,算法很重要。把程序写得优雅一些,而不是很笨拙。以你的这段程序为例:
    你可以这么写:
    Public Const Admin_Level = 100
    Public Const BBSAdmin_Level = 90
    ...
    Public Function CheckUser(ByVal UserID As String, ByVal Level As Long) As Boolean
        ...
        sql = "select userlevel from users where id = " & id
        Set rs = conn.Execute (sql)
        CheckUser = (rs("userlevel") >= Level)
    End Function调用:
    <%
    Set tests = Server.CreateObject("classname.testsubs")
    If tests.CheckUser(22, CheckUser.Admin_Evel) Then
        ..... '这里执行一系列动作
    Else
        Response.Write "你没权限操作"
    End If
    %>
      

  10.   


    除了这样,没其他方法了吗?这样也是导致大量的全局变量。如果这样,我就不如直接用在onstartpage中了。
      

  11.   

    修正下:
    调用:
    <%
    Set tests = Server.CreateObject("classname.testsubs")
    If tests.CheckUser(22, CheckUser.Admin_Level) Then
        ..... '这里执行一系列动作
    Else
        Response.Write "你没权限操作"
    End If
    %>很多初学者学习编程是从阅读和修改同样是初学者所写的丑陋的代码开始的。
    我的建议是从学习语法和算法开始,把基本功打好。
    写程序如同盖房子,没有地基到了一定的高度,光靠技巧,也无法让系统不垮掉。
    你对系统的驾驭能力就决定了你能写多大的程序。
      

  12.   


    兄弟,您可能用的是VB.NET吧?我用VB6做的,下面两行无法编译
    Public Const Admin_Level = 100
    Public Const BBSAdmin_Level = 90
    不好所以,我确实是VB新手。
      

  13.   

    Public Admin_Level = 100
    Public BBSAdmin_Level = 90
    呢。
      

  14.   

    Public Admin_Level As Long
    Public BBSAdmin_Level As Long
    ...

    Sub Class_Initialize() 里面写:
    Admin_Level = 100
    BBSAdmin_Level = 90
    ...
      

  15.   

    caozy兄,可能Sub Class_Initialize()也是VB.NET里面的吧?VB里只有ONSTARTPAGE,所以我写在ONSTARTPAGE了,可是ONSTARTPAGE里的变量也无法传递到ASP中的admin_level,在ASP中错误这句(tests.CheckUser(22, CheckUser.Admin_Level))
      

  16.   

    Sub Class_Initialize 是VB6里面的。在代码编辑器最上面的成员列表里面,顶上左边classname,右边就有。
      

  17.   


    我这样写了,也是出错在tests.CheckUser(22, CheckUser.Admin_Level),应该是checkuser.admin_level没获取到值