Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145901
  • 博文数量: 124
  • 博客积分: 70
  • 博客等级: 民兵
  • 技术积分: 1745
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-24 13:49
文章分类

全部博文(124)

文章存档

2011年(55)

2010年(14)

2009年(30)

2008年(25)

我的朋友

分类: WINDOWS

2008-09-12 14:58:23

今天发现一个问题
在vista下安装了ww beta3 的某个版本后,以管理员权限运行,而我们的xx模块实际上是将com对象的注册信息写道HKCU的,结果发现管理员权限运行时候com对象创建失败。
 
找来找去  
发现vista这个该死的,如果以非兼容模式,如下例般,如果不主动设置requestedExecutionLevel那么就将运行于兼容模式。
/////////////////////

     
   
/////////////////
 
当在兼容模式下,按上述url的msdn描述般,IL级别将高于middle 时候,管理员运行就是high。
而倒霉的CoCreateinstance 在IL > middle 时候将不独去HKCU,因此导致写道HKCU的值无法为所用。
 
从这个问题引出的另外的问题,我们如何解决进程外com的处理?
 
 
2008-10-29 今天发现manifest 方式在vista下,造成interface marshalling 选择位置出现问题。
比如下面这个manifest 在xp下工作非常正常,在vista下大部分情况工作也正常,但是当vista下的注册表的 Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Interface\{A7A822AB-89F1-4442-99B5-63167008C8F7}]
@="ISlotItemInfor"
[HKEY_CLASSES_ROOT\Interface\{A7A822AB-89F1-4442-99B5-63167008C8F7}\NumMethods]
@="47"
[HKEY_CLASSES_ROOT\Interface\{A7A822AB-89F1-4442-99B5-63167008C8F7}\ProxyStubClsid]
@="{00020424-0000-0000-C000-000000000046}"
[HKEY_CLASSES_ROOT\Interface\{A7A822AB-89F1-4442-99B5-63167008C8F7}\ProxyStubClsid32]
@="{D3880504-4B4B-4DD3-AA7E-E9956B72B83A}"
[HKEY_CLASSES_ROOT\Interface\{A7A822AB-89F1-4442-99B5-63167008C8F7}\TypeLib]
@="{044FEC04-C415-40AF-AD34-F44F62DA65A3}"
"Version"="1.0"
 
你看到如果这个ProxyStubClsid32 被填入了一个值,那么据我观察这个值得优先级高于manifest ,而恰巧由于由于历史原因,曾经被注册了一个错误的值,这样问题来了!
 
 


 
 ....
 
 
     
    
      wwsdkcom.SlotItemInfor.1
   

       
 

 
 
下面两篇文章有一些提示1
 
 
今天又发现了一个问题,在915发布前夕,突然发现涂鸦等插件在vista下运行出现了注册表读取问题。
如下:
1. 用户机器UAC关闭
2. 用户机器以管理员运行。
3. 用户机器的HKCU存在着一份注册信息。
4. 当以管理员运行aliim的时候,HKLM被写入了新运行的aliim所对应的插件信息。
5. 此时发现每次创建com对象时候,均加载HKCU处。
 
经过观察发现,HKCR实际上是HKLM+HKCU的合并。但是HKCR优先展示HKCU处的键值。
结果在HKLM,HKCU冲突时候,HKCR显示为HKCU,另外从实际上运行结果看,COM库应该是读取了HKCR的值,
也就是说实际上读取了HKCU的值。
 
这儿有一个问题,因为记忆中当IL > middle 时候,COM库是不读HKCU的,但是又能够让HKCU map过来,这个很奇怪,还需要验证一下。
 
 
从具体显现来看:
1. 值始终以HKCU的为准
2. key是合并的
 
 
阅读(1125) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~