作者存档: Xu Jiwei - 第16页

解决 ADODB.Stream 0x800A0C93 错误

ADODB.Stream在ASP编程中往往用于无组件上传,并且可以指定文件编码,可以应对各种不同的需要。但是在使用ADODB.Stream过程中,往往会发生这样那样的错误,昨天就碰到了一个0x800A0C93错误,在网上找了半天也没找到解决方法,找到的都是些什么权限的问题,但是在我使用的时候,权限配置并没有问题,因此只好自己琢磨了。

如果要再现这个错误,可以使用以下代码:

  • <script language="jscript" runat="server">
  • var obj = Server.CreateObject("ADODB.Stream");
  • obj.Mode =1;
  • obj.Type = 2;
  • obj.Open();
  • obj.LoadFromFile(Server.MapPath("test.asp"));
  • Response.Write(obj.Read());
  • obj.Close();
  • </script>

因为在使用ADODB.Stream时,我是想用它来读取文件,所以使用了Mode 1 - Read,然后使用LoadFromFile方法载入文件,但就是这里,出现问题了,运行到LoadFromFile的时候,出现错误,提示“应用程序请求的操作不允许出现在该上下文中 ”,弄了半天也没解决。

去网上找,解决方法大都一样,权限设置不对什么的,解决不了我的问题,只好继续自己琢磨。

又折腾了一会之后,想到,会不会是Mode的问题,因为之前这段代码是用得好好的,但是在放到我写的一个类的Read方法中之后,就把Mode改成1 - Read了,又想到,LoadFromFile方法应该是把所指定的文件内容写入到了ADODB.Stream对象的缓冲区当中,所以需要写权限,当下测试:

  • <script language="jscript" runat="server">
  • var obj = Server.CreateObject("ADODB.Stream");
  • obj.Mode = 3;
  • obj.Type = 2;
  • obj.Open();


阅读全文 »

在ASP里面创建GUID

GUID在许多时候做为唯一标识符都很方便,但是在ASP里并没有现成的函数来创建GUID,其实可以使用Scriptlet的类型库来创建一个GUID,代码如下:

JScript

  • function GenerateGuid() {
  • var TypeLib = new ActiveXObject("Scriptlet.TypeLib");
  • return (TypeLib.Guid);
  • }

VBScript

  • Function GenerateGuid()
  • Dim TypeLib
  • Set TypeLib = Server.CreateObject("Scriptlet.TypeLib")
  • GenerateGuid = TypeLib.Guid
  • End Function

如果要在客户端使用的话,VBScript的代码需要稍做修改,即把:

Set TypeLib = Server.CreateObject("Scriptlet.TypeLib")

修改为:

Set TypeLib = CreateObject("Scriptlet.TypeLib")

但是在客户端使用ActiveX的时候,IE默认的安全设置会提示是否允许使用ActiveX,所以并不推荐使用。

希望对你有所帮助。

[AJAX] ASP中使用GB2312编码时处理乱码问题

在AJAX开发中,编码问题往往是令开发者比较头痛的,特别是在编码不是UTF-8的情况下。虽然这篇文章是讲的怎么处理乱码问题的,但是我还是推荐在做AJAX开发的时候使用UTF-8编码,这样可以避免很多问题。

AJAX中,XMLHttpRequest发送数据和接收数据的时候往往都是使用UTF-8来处理数据的,也就是说,虽然程序是使用GB2312作为编码的,但是XMLHttpRequest还是以UTF-8来处理,这样就导致乱码问题了。

所以如果要解决乱码问题,可以通过指定文件编码来解决。指定文件编码后,XMLHttpRequest就会使用指定的编码来处理文件,这样,碰到GB2312编码的文件时,XMLHttpRequest还是能以GB2312编码来读取文件,这样就能避免乱码了。

要设置编码方式,可以发送ContentType头来指定。

在ASP里,要设置ContentType,可以用以下语句:

  • Response.ContentType = "text/html; charset=gb2312"

在ContentType里,charset就指定了文件编码。

一般在AJAX客户端需要处理和显示中文数据时候,最好在服务端设置文件编码,即设置ContentType。如果服务端不知道是否会返回中文数据,那么还是设置一下编码的好。

这样处理AJAX中乱码的方法并不局限于ASP,比如在PHP里也可以使用header函数来设置ContentType。其实理论上只要能在服务端设置HTTP请求的header,就能通过这样的方式来解决乱码问题。

就这样。

Windows Mobile 中启动外部应用程序

Windows Mobile下面Java一直没有比较好的模拟器,用了一段时间的JMM最新版,觉得不错,但是有些程序还是不能运行,就去下了个JBed,但是在JBed中安装程序时会搜索卡,感觉比较费时,用Resco Explorer用JBed带参数打开时,又安装不了,因为需要加额外的参数-ginstall,Resco Explorer不支持。

另外一种方法就是把 .jar 文件的关联改到JBed,不过平时主要用的JMM,不想改掉关联,所以想着写个程序,作为代理,在Resco Explorer里把 .jar 文件的路径传给这个代理,再通过这个程序带参数启动 JBed 来安装。

要做到这些,就需要在这个代理中启动外部应用程序,第一次写Windows Mobile下面的程序,不过都是微软一家人,也不是麻烦,在Google上找了资料,发现可以用 ShellExecuteEx 来启动外部应用程序,然后就开写了。

程序的主要代码就一段,功能就是接受参数,启动 JBed。

wchar_t* param;
param = (wchar_t*) LocalAlloc(LPTR, 255);
wsprintf(param, _T("-ginstall \"file:\\%s\""), lpCmdLine);
SHELLEXECUTEINFO execInfo;
ZeroMemory(&execInfo, sizeof(execInfo));
execInfo.cbSize = sizeof(execInfo);
execInfo.lpFile = _T("\\Storage Card\\J\\jbed.exe");
execInfo.lpParameters = param;
execInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
execInfo.lpVerb = _T("open");
ShellExecuteEx(&execInfo);



阅读全文 »

ActiveSync 和 DHCP Client

2003莫名的挂掉了,关不了机,加上2003用的时候越来越少,Vista的兼容性有些问题,就决定重新装回XP。

装完XP,按自己的喜好设置了一番,装好ActiveSync插上数据线跟手机同步,发现同步不了,郁闷。

可以说装XP的一大目的就是为了跟手机同步,原来在2003就一直同步不了,在Vista用移动设置中心倒是能同步的。

同学的电脑上用XP是能同步的,仔细想了想我的系统跟同学的有啥不同,好像也没啥,然后再试了下,注意到屏幕右下角总是有一个网络连接的图标在获取IP,同学的电脑用时却没有。再弄了会的时候突然想到了,会不会是我优化服务时把DHCP Client服务给设置为手动了的原因,导致Windows Mobile-based Device分配不到IP,然后就一直同步不了。

想到这,马上打开服务管理器,把DHCP Client服务启动了,果然,ActiveSync响了一声,箭头开始转起来。

弄了这么久,总算解决了这个问题,在想微软是不是应该在ActiveSync的帮助或者哪里说明一下ActiveSync同步是需要 DHCP Client服务的。

XSL中的运算符与变量名

昨天在写XSL模板的时候,在模板中使用了一个变量,结果在调试的时候却怎么也不行,我的变量名是$ItemCount,然后在模板中使用了这个变量 :

  • <xsl:value-of select="Tag[position() = $ItemCount-1]" />

在调试时却总是提示“无法解析到变量或参数 'ItemCount-1'的引用。变量或参数可能没有被定义,或它可能不在范围内。”,我就奇怪了,这名字明明是对的,怎么会有错呢,然后就又在变量定义的地方把变量名给复制过来,看看还是不是会出错,结果还是一样的错误。

这下郁闷了,懒得伺候了,把东西扔一边,玩去了~

今天想到这个事,再不行这个模板总是要写完的,于是又开了EditPlus,找到那一句,就在想怎么改它,突然脑子里来了一点点灵光,在减号的两边各加了一个半角空格,Firefox里打开,bingo!正确执行。

在解决了这个问题之后才想到,短划线也就是“-”在XML里是符合命令规范的,也就是说,我在写成“$ItemCount-1”的时候,XSL Parser 把“$ItemCount-1”认为是一个变量,而不会认为是一个表达式,因此,就会提示找不到变量,出错。

找到问题的原因所在,就好解决了,直接把减号给独立出来:

  • <xsl:value-of select="Tag[position() = $ItemCount - 1]" />

解决问题,继续写模板。

[ASP] 《在JScript中使用缓存技术》补遗

《在JScript中使用缓存技术》一文中,在JScript中实现了基于Application.StaticObjects的缓存技术,并且实现一个类用于缓存的操作,但在实际使用过程中仍需要注意一些问题。

在JScript的函数中,如果参数类型是number或者string,那么是按值传递的,但如果是object,那么就是按引用传递了。另外,数组在JScript中也是作为一个特殊的对象对待,因此,数组的类型也是object,同样是按引用传递的。

使用xbsCache类进行保存和获取数据操作即put和get时,不管是按值还是按引用,都没有问题,但是在使用过程中,对数据操作的效果由数据类型不同而不同。

如果数据是number或string类型的,那么在get数据时,返回值是按值的,也就是说,我们得到的数据是缓存数据的一份copy,对变量的操作并不会影响到缓存中的数据,例:

  • // code by xujiwei
  • // from www.xujiwei.cn
  • var myname="my name is xujiwei";
  • xbsCache.put("name",myname);
  • // 从缓存中获取name,值为"my name is xujiwei"
  • var myname2=xbsCache.get("name");
  • // 给myname2赋值"xujiwei"
  • myname2="xujiwei";
  • // 从缓存中获取name,值仍为"my name is xujiwei"
  • var myname3=xbsCache.get("name");

但是在数据类型为object的情况下,我们就需要注意,在从缓存中获取数据之后,我们得到的只是一个指向缓存数据的引用而已,并不是缓存数据的copy,因此,对数据的修改是直接影响到缓存的,例:

  • // code by xujiwei
  • // 


阅读全文 »

[ASP] 在JScript中使用缓存技术

在编写ASP程序时,通常为了提高ASP程序的运行效率及减少对数据库的连接和查询,会使用缓存技术来缓存一些需要从数据库读取的数据。而在ASP中实现缓存的方法常用的就是使用Application对象。在编写ASP程序时,我们有两种语言可以选择,分别是VBScript和JScript。

在使用VBScript时,我们可以用Application缓存数组来实现缓存,例:

  • Dim rs,arr
  • rs.Open conn,sql,1,1
  • arr=rs.GetRows()
  • Application.Lock()
  • Application("cache")=arr
  • Applicatoin.UnLock()

在VBScript里,数组是可以存到Application对象里的,但是如果ASP的语言选择为JScript的话,那么就有些不妙了,我们在使用Application储存一个数组时,会出现以下错误:

Application object, ASP 0197 (0x80004005)

Disallowed object use

Cannot add object with apartment model behavior to the application intrinsic object.

在微软的知识库可以找到具体原因如下:

JScript arrays are considered to be "Apartment" COM components. Only Component Object Model (COM) 



阅读全文 »

Ubuntu中使用锐捷+L2TP协议VPN拨号上网全攻略

06.09 Update 把忘记的压缩包补上了,以及标明了一些不同网络环境下需要修改的地方

这段时间实在是事情一大堆,所以虽然19号就搞定了Ubuntu下面的VPN拨号上网,但是隔了这么久才写这篇文章。

在Ubuntu 6.10出来的时候,就装上了,但是在搞定了锐捷,能上内网之后,就搞不定用VPN拨号上外网了,所以就一直没怎么用Ubuntu。在160G的硬盘坏之后,就更没条件去尝试Ubuntu上网了。一个阳光灿烂的下午,去把硬盘换了个新的回来之后,过了一天Ubuntu 7.04的CD就到了,刚好,听说Ubuntu 7.04 Fesity在VPN支持方面做得比较好了,就把Ubuntu给装上了。但是学校的VPN拨号是用L2TP协议,而不是PPTP,因此找到许多文章都没有用,只能自己摸索,某天晚上,弄到3点钟,终于让我撞大运,给弄出来了。

好了,废话不多,开始正事。

1. 准备工作

首先要做的是把本机的IP给设定好,在“系统>系统管理>网络”里进行设置,选择“Wired conection”,然后属性,设置Configuration为静态IP方式,然后把IP、子网掩码和网关按网络中心给的设置设置好。

接着,切换到DNS选项卡,把网络中心给DNS服务器给添加进去。

2. Ubuntu中的锐捷认证

虽然锐捷官方也出了Linux下面的Linux认证工具,但是那个工具是会检测代理服务器,因此在Ubuntu认证完成之后,过一段时间会莫名奇妙的断掉,所以我们需要寻找能代替官方认证工具的认证工具(呃,有些拗口)。

万幸,已经有牛人也是用的锐捷认证,并且破解了官方的认证工具,使它不再检测代理服务器,这个认证名字叫做myxrgsu,我已经放在文章末尾的压缩包了。运行myxrgsu之后,输入用户名和密码,并选择自己的认证方式就可以认证成功了。注意,运行myxrgsu需要root权限。

XRGSupplicant 1.1.1
Ruijie Network CopyRight 2004-2005
Please input your user name:{用户名}
Please input your password:{密码}
Use DHCP,1-Use,0-UnUse(Default: 0):
Use default auth parameter,0-Use 1-UnUse(Default: 0):
Searching server...
Connecting server...
Authenticating...
{认证成功时的服务器消息}
Authenticate 



阅读全文 »

Firefox与IE兼容性:getAttribute的返回值类型

在改AJAXRequest的过程中,碰到了个问题,应该算是Firefox和IE之间的兼容性问题。

提交表单时,往往需要先对表单进行验证,而这个验证的过程一般是放在form标签的onsubmit属性中。

onsubmit一般是由浏览器在form的submit动作发生时自动触发,但是如果表单由我们自己来提交,比如在AJAX应用中,就是由我们自己写程序将表单转换成请求字符串,再通过XMLHttpRequest发送到服务器,那么如果在此同时不丢掉表单验证的话,就需要我们自己来获取onsubmit属性,并去处理它。

在获取属性时,为了保证兼容性,我用getAttribute来获取标签的属性值,但是发获取了onsubmit属性之后,发现在Firefox和IE中使用getAttribute("onsubmit")所返回的返回值类型是不同的。

测试代码如下:



阅读全文 »