Windows 7용 manifest 삽질기


많은 분들의 도움 덕분에 VCi 2.3에서 드래그앤 드롭이 정상동작 하지 않던 문제의 원인을 확인했다.
원인을 알고보니, 혹시나 걱정했던 문제[각주:1]가 아닌 manifest를 잘못 지정한 것이 원인이었다.

Windows XP 시절에 uxtheme를 적용하기 위해 사용되던 manifest는 이런 형태였다. (이하 manifest-1)

<?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="X86"
    name="Microsoft.Windows.YourApplication"
    type="win32"
/>
<description>YourApplication</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

Vista/Win7 시절로 접어들면서 manifest를 통해 실행 권한을 부여하게 되었다.
아래와 같은 형태가 가장 기본적으로 적용되는 표준형 manifest이다. (이하 manifest-2)

<?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="X86"
    name="Microsoft.Windows.YourApplication"
    type="win32"
/>
<description>YourApplication</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

그런데, 어디선가 주워들은 것이, Privilege를 더 높이면 항상 관리자 모드로 실행된다는 얘기였다.
아니! 그렇다면 manifest를 잘 지정하면 Windows 7에서 안정성을 높일 수 있다는 얘기이지 않은가!
그래서 지정한 형태가 아래와 같은 형태이다. (manifest-3)

<?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="X86"
    name="Microsoft.Windows.YourApplication"
    type="win32"
/>
<description>YourApplication</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="False"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

그리고, VCi 2.3manifest-3을 적용하여 많은 PC에서 잘 동작하는 것을 확인했다.
그런데, 여러가지로 확인해본 결과 manifest-3은 일부 Windows 7에서 정상동작하지 않는 문제가 있었다.

결국 manifest-2로 돌아갔고, 잘 동작한다는 것을 확인했다. 휴~

덧. 도움을 주신 모든 분들께 감사드립니다. 고맙습니다. 꾸벅.

  1. Visual C++ 6.0은 Windows 7과 XP에서 컴파일한 결과가 다른 황당한 문제가 발생할 때가 있음 [본문으로]