又是vista。又是vc6。
控制面板项就是一个cpl,说到底不过也就是一个dll。没有料到在vista下dll也需要manifest。这是第一个问题。
在这个dll中执行程序竟然返回740。这是第二个问题。
第一个问题的解决:
在dll的资源中增加自定义类型 24
IDR_MANIFEST 24 DISCARDABLE "res\\vista.xml"
然后增加一个vista.xml文件。内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="*"
name="AFAXCtl"
type="win32"/>
<description>Consumer Control Panel</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
大家容易忽略绿色部分,红色部分需要说明一下:操作权限根据当前调用者而定,千万不能设置requestAdministrator。而“IDR_MANIFEST” 需要设置成123,没有写错,就是 123。以前看到别人说dll应该是2。我参考了第三方的控制面板后,发现都是123。
第二个问题的解决:
很奇怪winexec,createprocess都返回740失败。上网看看以后发现上述两个方法不会与UAC交互,因此得不到确认,当然就失败了。幸好shellExecute可以使用,据说方法内部与UAC交互了。使用如下:
ShellExecute(NULL,TEXT("open"),程序路径,程序参数,NULL,SW_SHOWNORMAL)
问题解决,下班回家。