Categories

Links

vb 6模块级变量

vb 6的模板级变量相当于C#/java中的静态变量(类变量),其生存期在进程级


因此,如果要实现sinleton模式,一般的代码就是
module1.bas
-------------------
public mInstance as xx


class1.cls
---------------------------
public property get Instance as xx
      if mInstance is nothing then
          set mInstance =new xx
       '初始化
      end if
      set  Instance=mInstance
end property

vb是单线程,我们不用担心在 set minstance=new ...后另一个线程进入,然后因为minstance is nothing不成立而跳过初始化过程的问题。

在一个普通的com应用中,这就是全部。无需考虑更多问题,甚至在iis中这种多用户环境也是如此

但如果你创建的是一个com+应用,这将有问题。

因为com+将开辟不定数量 的STA,每个模块变量在各个STA中有副本,不同的客户可能工作在一个STA中,也可能不在一个STA中。显而易见,如果A在STA 1中,B在STA 2中,a修改了Instance,而B是看不到这个变化。


因此,在com+应用要确保你的模块变量在初始化后不被修改,否则,你可能需要使用com+的共享属性管理器

在一个com+应用中,模块级理想的初始化过程在sub Main过程,因为com+在初始化一个STA时会执行该过程。当然,前面代码的初始化也不会有什么问题
因为模块级变量的生命周期在进程级,因此,要小心在模块级变量持有其它对象的引用,因为这将导致其不能被正常释放

[2004-12-20 10:47:42 | Author:jiangjianxiao ] [] 5 comments

vb4tools

很老的资源,但vb4tools(http://www.kenai.com/vb4tools/ )和vboost( www.powervb.com) 一直是我做vb6程序时必须依赖的组件 。

最新的vb4tools是附带在winwrap basic或saxbasic(winwrap basic的oem)中的typelib 2。里面有一些很有意思的东西,大家不妨下载saxbasic看看。

虽然,vboost,spyworks之类的大大的扩展了visual basic 6的功能(比方说我经常用vboost的聚合),虽然vb6也能运用一定的设计模式和思想(我自己就有spring ioc的 vb6实现,虽然不完美,但你可以以类似的方式去工作)。但是visual basic 6得确已死。包括visual j++(我是visual j++的正版用户,也是我惟一购买的编程语言:))。很多时候,我们程序员是牺牲品。vb6可以做的更好,因为它本来就在虚拟机类似的工作机制上运行。就像com+解决方案一书中所说的,vb6可以更好的处理垃圾收集。像visual j++,如果其能发展到今天,会有c#吗?不敢想象,我每每看 visual j++的wfc,就同看.net framework类似(这个观点在好几年前都说过)。

不过,就像.net framework从visual j++的开发中借鉴了许多一样,我们 的开发经验不会被淹没,其实,对于vb6开发者而言(以我自身而论),更多的只是行业经验,从vb6中,不会积累什么好的设计经验。事实上,最近一年 了,我用vb6就像用.net/java一样,当然,这有点痛苦。因为没有继承,没有构造函数,类消耗太大,没有模板方法,只有用策略模式。因此,在vb6中引入像spring一样的容器会很有益,可以做一些对象创建前额外的工作。就像com+或是scm所做的一样。

另外,对于aop,我现在的理解就是拦截器+聚合(从spring的aop实现来看)。其实,vb6也可以实现拦截器,不过由于必须通过IDispatch接口来做,因为IDispatch需要使用GetIdsOfNames和Invoke.可以利用vboost提供的一些机制。或通过这个例子(http://www.mvps.org/emorcillo/vb6/com/com_disp.zip)来稍加改动来实现。当然,像spring之类的容器是必须的,提供一个类似IFactoryObject之类的功能,使用户能在获取实例前做这些先期工作。我以前有个实现,但由于这种实现将退化为后期绑定,用在asp中尚可,在c/s项目中不太可能(因为对象声明通常是显式的),因此在一次重装机器时,竟然被删除了:)。

最近,因为升级要升级activecontent,所以我需要搞清vb6的一些问题。可能会在blog中发表一些似是而非、有错误的话题。希望名眼人能够指出。

[2004-12-17 08:11:24 | Author:jiangjianxiao ] [] 2 comments

集成com与java 组件

今天,阅读了 developerworks上的 集成com和java组件 一文。不同于interface tool,这个名为Development Tool for Java-COM Bridge的工具,只支持vtable调用,性能有 了很大的提升,但还是比visual j++比逊色。
我对其做了一些测试,在java环境中使用com组件,同vb环境中调用同样的com dll相比,差距在 1倍起,测试在vb环境中调用java 构造com组件,结果也是如此。

将java对象暴露为com对象的步骤需要四个过程,相当繁琐,第一次花了我一个多小时。不过,这得确是当前性能较好的实现了。值得一试。

使用中,发现需要增加JDK_ROOT环境变量,否则在eclipse中,vc6的项目build会失败。

ikvm 已经发布了一个新的版本,与1.0的距离正在接近。

集成com与java 组件
http://www-900.ibm.com/developerWorks/cn/java/j-intbridge/index.shtml
ikvm blog http://weblog.ikvm.net

[2004-12-04 15:38:38 | Author:jiangjianxiao ] [] 1 comments

关于IKVM

除了作者的weblog,好像没有人讲过其性能如何?从作者的blog上,可以发现ikvm比jdk的效率还要高些。
我随手写了一个简单的测试,可能需要声明这可能不正确。

通常,我关心对象的创建和属性的设置和取值,这往往是跨层调用的致命之处。无论是java/com,.net/com或是java/.net都是如此。
java/com,无人能比过visual j++(我的使用经历是visual j++创建的dual interface的com比vb创建的更快)。.net/com调用通常需要花费几倍的时间。通常,我一般认为可接受的在一倍以内,如果是1/3,我就会使用它。

ikvm 看来达到了我的要求
我创建了一个Category类,有三个私有字段id,name,level和其相应的setter,getter,下面是测试的java代码
public long speed(){
  long start=System.currentTimeMillis();
  
  for(int i=0;i<100000;i++){
   Category c=new Category();
   c.setId(i);
  c.setName(String.valueOf(i));
  
   c.setLevel(i);
   c.getId();
   c.getName();
   c.getLevel();
  }
  return  System.currentTimeMillis()-start;
 }

这段代码在eclipse中运行通常小于120毫秒。
同样的代码可以放在C#中运行,其时间通常是156毫秒
当然,大家会发现在C#中
c.setName(String.valueOf(i));

可以优化为
c.setName(i.ToString());
这样,这段代码在C#中运行时间会小于110秒,当然,这不能用来与java比较。但可以发现.net的值类型的概念带来的一些好处

同样,我也测试了在.net中直接调用java代码的speed过程,通常这比在.net中构造相同的代码快10毫秒左右。

看来上面的这段文字,我想大家可能会同我一样对ikvm开始发生兴趣了吧。以后,我想我会关注以下的内容
①java编译器对ikvmc的影响(作者强调用jikes)
②一个列表,整理能被ikvmc能被顺利转换的java库。

其中,第二个工作是个体力活,如果有一些人来做,会比一个人做好许多

ikvm 站点 www.ikvm.net
ikvm 作者的weblog  http://weblog.ikvm.net

[2004-12-01 22:33:11 | Author:jiangjianxiao ] [] 1 comments

Spring.Net 的一些介绍文字

我写了一些Spring.Context命名空间的介绍文字,发在dotnettools 评测网上,其本意想引发一些讨论。但结果:)

这里就只贴出链接,有兴趣的可以过去看。

Spring.Net  IOC
Spring.Net 介绍(2)-国际化支持  
Spring.net 介绍(3)-资源访问  
Spring.net 介绍(4)-事件支持
Spring.Net 重要接口介绍

关于spring.net web的初始化版本,其实我有很多想法的,可惜我的英文能力和技术水平有限,无法同开发团队作进一步的交流。

spring.net web初始化版本预览  

今天,第三个基于在ioc容器开发的程序接近尾声了,nhibernate和spring.net 整合也已经完成一个初步的版本。稍后,我将介绍实现要点。希望能赶在spring.net发布类似内容之前。

[2004-11-24 19:34:20 | Author:jiangjianxiao ] [] 2 comments

Total 91 Display 76 of 80
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Powered by Google App Engine