vb 做web服務程序時遇到的問題??(compile :error error in loading DLL)
后台程序用vb webclass 做得,run运行时,出错信息如下:
compile :error error in loading DLL
只有将所有的 Designers 都打开,再存盘即可,启动服务程序没问题。
但是关机后,再启动机器,又有相同问题出现,只有将所有的 Designers 都打开,再存盘即可,启动服务程序没问题!
每天搞数次,烦死了!
请高手出招!
后台程序用vb webclass 做得,run运行时,出错信息如下:
compile :error error in loading DLL
只有将所有的 Designers 都打开,再存盘即可,启动服务程序没问题。
但是关机后,再启动机器,又有相同问题出现,只有将所有的 Designers 都打开,再存盘即可,启动服务程序没问题!
每天搞数次,烦死了!
请高手出招!
WebClass实现动态WEB编程之理论篇
(作者:苏红超 2001年01月10日 15:50)在前一段时间,我曾经在“用VB ActiveX DLL实现ASP编程”一文中详细探讨过如何使用ActiveX DLL技术替代简单的纯ASP来实现核心代码和商业逻辑的封装。适当的利用ActiveX DLL技术在构建动态WEB站点的时候的确能够带来很多的好处,这是显而易见的,但是仍然需要一个单独的ASP文件来创建和销毁我们所编写的ActiveX DLL组件,在ASP中大量使用ActiveX DLL是不现实的,并且我们的ASP编程仍然不可以像往常的应用程序那样进行编写,因为凌乱的ASP代码和HTML代码交织在一起,并且,无论是单纯的ASP程序还是封装了ActiveX DLL的ASP程序,一个最大的弊端就是在项目开发过程中的调试困难,比如很难设置断点并随时暂停程序来察看某些变量的值。那有没有两全其美的方法呢,既保证开发WEB程序的高效率,又可以向平常的应用程序那样可以方便的调试和编写呢?答案当然是肯定的,微软公司在VB6版本之后就引入了“WebClass”的概念,并且在新建项目中增添了名叫“IIS应用程序”的项目类型。WebClass正是微软公司提出的用来使得程序员可以像开发普通应用程序那样来开发WEB程序的解决方案!
说起“IIS应用程序”,大家会认为这和ASP程序有何区别呢?ASP不就是运行在IIS上面的WEB应用程序吗?其实这是微软命名上面的一点小错误,使得大家在名称上面比较容易混淆。我们现在应该清楚,“IIS应用程序”就是采用WebClass技术用来实现和ASP同样功能的应用程序,它避免了ASP的种种缺点,比如源代码是透明的、解释执行带来的速度慢。其实WebClass应用程序也是一种VB组件,使用他完成的WEB应用程序将会是编译之后的,其运行速度有很大提高,同时也避免了源代码和核心技术及商业机密被泄漏。 WebClass 在实质上是一个VB组件,确切一点说来讲WebClass是一个ActiveX DLL。他使得你可以编写服务器端代码以响应来自用户的浏览器请求。对用户来说,一个 IIS 应用程序好象是由一系列的HTML页面组成;对开发者来说,一个 IIS 应用程序是由一些被称为 webclass 的特殊类型对象组成。WebClass可以直接访问所有的ASP内置对象(request、response、application、session、server)。任何使用ASP开发的WEB项目都可以在WebClass中实现。由于在WebClass中引入了HTML模版的概念,从而有效的避免了ASP中的程序代码和HTML代码相互交织带来的缺陷,很好的实现了商业逻辑层和最终表现层的分离(有些类似当前XML和XSL的形式),极大的提高了WEB项目的开发效率。 IIS 应用程序在表面上和 Active Server Pages 应用程序相似。这两种应用程序都显示动态的 Web 站点,并且都是在服务器上而不是在客户端上执行它们的处理。但是,每一种都有自己独特的优点: (1)Active Server Pages 适合于对制作 Web 页面感兴趣的脚本开发者,它提供了将脚本和 HTML 混合起来的独特能力。 (2)IIS 应用程序适合于构造基于 Web 应用程序而不是 Web 页面的 Visual Basic 开发者。IIS 应用程序允许复杂的事务处理,并且几乎任何的浏览器或平台都可以很容易地访问它。 使用IIS应用程序来开发WEB项目可以有如下优点: (1)熟悉的开发环境和模型。可以利用 Visual Basic向工程添加类(Class)、模块(Model)或任何 Visual Basic ActiveX 部件,因而易于调试和编写。 (2)使用的广泛性。可以被大多数的浏览器支持。 (3)可重复使用的部件。类似于面向对象编程;各个对象之间可互相访问。 (4)代码和 HTML 相分离:和编写ASP 应用程序不同,Server 端处理程序和Client端程序分离,便于维护和修改。 (5)可自定义处理事件,因而编写方法灵活 接下来我们来看看WebClass的具体组成部分是什么: Webclass 由html模板和自定义 Webitem 组成。( html模板和自定义 Webitem统称Webitem)当然不是必须包含模板和自定义的Webitem。 (1)一个 HTML 模板文件是与 webclass 相关联的HTML页面。当 webclass 收到一个请求时,它可以向浏览器发送用于显示的HTML页面。模板和常规HTML页面的不同仅在于向浏览器发送页面之前,它常常包含 webclass 可以处理的替换区域(通常是用"WC@"标签定义的范围)。这样就允许自定义自己的响应。 (2)一个自定义的 webitem 是由一个或多个事件处理程序组成的程序资源。在页面加载或用户选择一个 HTML 元素时,这些事件处理程序被浏览器调用。这些事件处理程序可以对浏览器产生一个响应或将处理传递到另一个 webclass 的 webitem。 一个完整的WebClass应用程序的大致流向如下所示: A.指定某一个WebClass(比如Test1)作为首先启动的项目 B.激活这个WebClass(Test1)的WebClass_Start事件 C.在Test1的WebClass_Start事件中调用某一个HTML模板的WriteTemplate方法,比如Check. WriteTemplate这里的Check就是一个属于Test1这个WebClass的一个HTML模板 D.在你的这个Check模板中如果有<FORM>存在,那就会触发这个<FORM>的ACTION属性,比如<form action=xxx.asp?WCI=ddd>,那么就会调用属于名为'xxx'的这个WebClass的'ddd'项目(Item);当然这个'xxx'可以是你刚才操作的WebClass本身,即"Test1",同样,这个"ddd"可以是一个HTML模板或者一个WebItem。 E.触发属于"xxx"这个WebClass的项目"ddd"将会激活"ddd"本身的ddd_Respond()事件,你就可以在这里进行一些处理了,比如检索数据库资料;然后可以再调用其它HTML模板的WriteTemplate方法,比如就调用本身的ddd.WriteTemplate方法 F.然后将会调用ddd的ProcessTag事件,进行卷标的处理过程,当然你的这个叫ddd的HTML模板中就要有相应的WC@卷标了。 我们再来看看Webclass中的事件响应。 1. .Webclass中预定义的事件有3个 : response , processtag , userevent .response 事件响应用户端请求。 .processtag 事件是作为 WriteTemplate 方法处理的一部分自动发生的。不能单独被触发或用来处理响应。 .userevent 事件: 一个 UserEvent 过程处理 webitem 的所有用户事件。UserEvent 事件是由URLFor 方法在运行时产生的。所以只有使用了URLFor 方法动态产生的超链接才会触发UserEvent 事件。 2. Webclass_start() 事件类似于VB中的Sub Main()。 所以可以指定一个project 开始的webclass。也可在model 模块中用Sub Main() 来启动。 3. 发送html 到浏览器: 将页面反馈回浏览器有两种方法。 A.对html模板使用 "writetemplate" 方法。此方法激活"ProcessTag"事件,从而对模板中相应的内容(用WC@符号标记的部分) 进行替换。 B.在Customwebitem 事件中动态生成反馈页面。 如: with response .write "<html"> .write"<head>" .write"</head>" .write"<body>" .write"<p>Hello! Universe!</p>" .write"</body></html>" end with 4. 从HTML 的<form>中获取信息: 使用Request 对象在一个 HTML <form>中获取用户输入的信息。但必须将 <form action...> 标记属性和webclass中的一个事件连接,提交一个form 就可以激发 webclass 中的这个事件。因此,就可以使用这个事件搜集和操作信息。 5. 动态替换html 模板文件中的内容:使用3中的writetemplate 方法。 6. 自定义webitem 事件。 两种方法和自定义webitem 事件关联起来: A.用action=webclass.asp?wci=webitem&wce='自定义事件'的方法。 B.用URLFor (Webitem,自定义事件)方法。 7. 其他使用方法(如: Cookie,Session对象等) 和 ASP 应用程序中相同。 WebClass中在传回给用户的HTML中可以使用两种方法建立超级链接,很容易造成混淆,这里我就详细讲解一下这两种方法: 方法一. 一种是直接使用类似于这样的格式<A Href="xxx.asp?WCI=sss&WCE=ddd">,这样当用户点击这个超级连接的时候,就会传跳到xxx这个WebClass的sss项目的sss_UserEvent事件当中来,你就可以在这个事件中进行一些处理,而且这种生成超级连接的方法可以在自己的后面带许多的自定义的参数,比如<A href="xxx.asp?WCI=sss&WCE=ddd&Test=www&Me=rrr...">其中的Test,Me都是我们自定义的参数,可以在转跳之后页面中使用Request("Test")方法取出其中的值,这样就提供了一种在页面之间传递值的解决方法; 如果你没有指定WCE参数,比如<A href="xxx.asp?WCI=sss">那么将会转跳到xxx这个WebClass的sss项目(Item)的sss_Respond事件,而不是他的sss_UserEvent事件中! 方法二. 第二种方法是使用URLFor方法,URLFor(WebItem_Name,UserEvent_Value)。比如,<a href=""" & URLFor(Check, CStr(recCheck("QTFTBN"))) & """>" 注意,在这里要使用两个双引号代替一个双引号。 这样,就会转跳到本页(就是本身的WebClass)中的Check项目(Item)中的Check_UserEvent事件中去。URLFor方法只会触发UserEvent事件,而不会触发Respond事件!在Check_UserEvent事件中你可以使用这个事件的EventName参数获取上面传来的' CStr(recCheck("QTFTBN"))'这个值。
(作者:苏红超 2001年01月10日 15:50) 说了这么多的有关WebClass理论方面的东西,想必大家也一定想要亲自试一试究竟WebClass是怎么样一回事情了,那我们就先来看一个小的例子,也慢慢消化一下我们上面讲解到的各种理论知识: 启动VB6集成环境之后,新建一个“IIS应用程序”的项目。这样缺省的情况下就会创建一个名称是Project1的工程以及一个叫做WebClass1的缺省的WebClass对象。WebClass的开发环境有两部分组成:WebClass设计器和代码窗口。其中的WebClass设计器的地位就像往常的VB表单设计器一样,通过他可以添加新的HTML模版WebItems,添加Custom Webitems对象,以及在WebItems中添加各种事件处理过程和启动停止本地的Web Server。当这个项目运行的时候,会初始化WebClass对象,会触发WebClass_Start事件,也就是说这个事件类似于VB中的Sub Main函数,他会首先被触发。 我们来先写一段最简单的WebClass程序代码: Option Explicit Option Compare Text Private Sub WebClass_Start() Response.write "<html>" Response.write "<body>" Response.write "<center>这是我们的第一个WebClass程序!</center>" Response.write "<center>当前的系统事件是:" & now() & "</center>" Response.write "</body>" Response.write "</html>" End sub 好了,我们需要保存这个工程,运行的时候VB会提示我们建立一个新的WEB,是为了可以在VB中运行我们的WebClass工程的时候调试的方便。之后,我们运行这个项目,VB就会自动调用Internet Explorer浏览器浏览我们的程序,并且你可以随时在我们的WebClass程序中设置端点来跟踪各种变量的值,这在普通的ASP程序中是无法想象的事情,但是使用WebClass却是如此的方便和自由! WebClass使用WebItem向浏览器提供内容和事件。每一个WebClass都会包含多个WebItems。而WebItem则有两种类型:HTML Template WebItem和Custom WebItem。通过HTML Template WebItem可以将HTML文件和WebItem联系在一起,所以在添加WebItem之前必须创建我们需要的HTML文件。值得注意的是:当你在添加HTML模版的时候,如果模版文件和我们的工程文件不在同一个目录中,则系统会将模版的一个副本拷贝到工程所在的目录中;如果模版文件和工程文件在同一个目录中,则系统会重新命名这个模版副本的名字,而我们在需要改动模版的时候,需要改动的是这个模版的副本,而不是它本身! WebItem使用方法WriteTemplate()来对响应输出模版内容。下面我们再来看一个结合了HTML Template WebItem的程序: 在我们刚才的WebClass1工程中添加一个HTML Template WebItem,系统会提示我们选择一个HTML文件,我们选择的HTML文件是test.htm,内容很简单: <html> <body> <br>这是模版test中的内容:Hello,world! </body> </html> 添加之后,我们会在WebClass设计器中的“HTML Template WebItem”下面找到名为“Template1”的一个模版,为了方便,我们更改他的名字为“test”。 这样我们的代码变动如下: Option Explicit Option Compare Text '模版test的Response事件 Private Sub test_Respond() Response.Write "<h1><br>模版test中的response事件响应!</h1>" '调用WriteTemplate()方法来处理我们的名叫test的HTML模版文件 test.WriteTemplate End Sub Private Sub WebClass_Start() '写一个对用户的回答 Response.write "<html>" Response.write "<body><h1>" Response.write "<center>这是我们的第一个WebClass程序!</center>" Response.write "<center>当前的系统事件是:" & now() & "</center>" Response.write "</h1></body>" Response.write "</html>" '将控制权交给名为test的HTML模版,会首先触发他的Response事件 Set NextItem = test End Sub 我们运行这一段WebClass程序,则会在浏览器中显示如下(图1):
接下来我们看看Custom WebItem,这种类型的WebItem没有相关的HTML文件,顾名思义,他是用户自定义的WebItem,他是不可以使用WriteTemplate()方法的。同样可以通过设置NextItem属性来触发Custome WebItem。我们就不再重复了。 探讨完了两种类型的WebItem,我们来看一个综合利用这两种类型WebItem的例子: Option Explicit Option Compare Text Private Sub custome_Respond() Response.Write "<h1><br>用户自定义WebItem(Custome)的response事件响应!</h1>" Response.Write "<br><h1>接下来处理用户的选择!</h1>" '处理用户做出的选择 Select Case Trim(Request.Form("userchoice")) Case "普通工人" Set NextItem = workerpage Case "销售人员" Set NextItem = salespage Case "其它" Set NextItem = otherpage End Select End Sub Private Sub otherpage_Respond() Response.Write "<h1><br>模版otherpage的response事件响应!</h1>" otherpage.WriteTemplate End Sub Private Sub salespage_Respond() Response.Write "<h1><br>模版salespage的response事件响应!</h1>" salespage.WriteTemplate End Sub Private Sub workerpage_Respond() Response.Write "<h1><br>模版workerpage的response事件响应!</h1>" workerpage.WriteTemplate End Sub Private Sub WebClass_Start() 'Webclass启动的时候生成我们需要的一个表单 With Response .Write "<html><body><h1>" .Write "<center>处理表单</center><br>" '设置表单提交到我们的Custome Webitem(custome)中,会首先触发custome的response事件 .Write "<form name=test1 method=post action=" & URLFor(custome) & ">" .Write "选择你喜欢的职业:<select name=userchoice>" .Write "<option value=普通工人>普通工人" .Write "<option value=销售人员>销售人员" .Write "<option value=其它>其它" .Write "</select><input type=submit value=确定></form>" .Write "</h1></body></html>" End With End Sub 其中的三个HTML模版内容如下: HTML模版otherpage: <html> <body> <h1>你选择的是其他职业!</h1> </body> </html> HTML模版salespage: <html> <body background=""> <h1> <br>你选择的是销售人员职业!</h1> </body> </html> HTML模版worker: <html> <body> <h1>你选择的是普通工人!</h1> </body> </html> 运行这个项目之后首先会出现如下叶面,让用户选择喜欢的职业:
如果用户做出了自己的选择,并提交了这个表单,则显示如下图: