今天发现一个问题
在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是合并的
阅读(1120) | 评论(0) | 转发(0) |