解决在vista下控制面板项创建进程的问题

     又是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)
   问题解决,下班回家。





原文地址:https://www.cnblogs.com/febwave/p/1188770.html