以前老的ATL组件供asp调用,里面用到了GetUserName  API函数,得到的是账户是SYSTEM;
而我自己创建的ATL ActiveX server组件供asp调用得到的账户却是IUSER_COMPUTERNAME(因机器而异)我看了源代码,里面的ActiveX server对象的设置都是apartment,both Aggregation的,其idl文件和其它头文件和源文件没有明显的差别; 两个组件都是放在默认网站的bin目录下的。为什么会不一样呢,烦请高手解答!

解决方案 »

  1.   

    因为GetUserName是得到当前进程的用户名,而你的ATL组件的宿主进程估计是用SYSTEM进程启动的
      

  2.   

    这两个组件的使用者是有本质区别的:
    普通ATL组件是IIS服务调用的,IIS服务的帐户是SYSTEM;
    ATL SERVER组件是由具体的浏览器用户请求而被间接调用的,用户请求的调用使用的帐号是IUSER_xxxx。
      

  3.   

    以上说得似乎挺对的,但是我的这两个组件都是ActiveX SERVER组件。
    并且我发现如果是ATL添加的是简单组件(simple object)的话,供asp调用后返回的是IUER_**** 。与添加ActiveX Server component供asp调用返回的值是一样的。按理说返回IUER_****是正常的,但是返回SYSTEM好像显得不正常。至于以前的组件为什么会返回SYSTEM,我觉得很纳闷。
      

  4.   

    还是取决于调用环境,是被服务调用还是被session调用。我也不知道你的组件是如何被调用的。
      

  5.   

    asp代码中是这样的
    Dim obj
    set obj = Server.CreateObject("AspUpload.UploadFiles")
    ……
    ……
    应该说两个组件的调用环境是一样的,都是放在默认网站下的。并且在asp代码中除了CreateObject()中的对象不一样外,其它的是一样的。组件应该是被服务调用的吧
      

  6.   

    网页里的代码都是被session调用的,isapi扩展或过滤器是被服务调用的
      

  7.   

    发现问题之所在了:看代码时自己有点儿粗心。以为两者的线程模型是一样的,后来发现是不一样的,呵呵
    我测试的两个如下:
    single:返回的是SYSTEM
    apartment:返回的是IUSER_****
      

  8.   

    上面不小心写错了:
    free:返回的是SYSTEM
    single和both下面没有测试过……