25128


i686-w64-mingw32を使ってverifyversioninfo関数を使おうとしたのですが、失敗しました。

win8.1以降でverifyversioninfo関数を使うにはマニフェストファイルが必要らしいので、下記URLを参考にマニフェストファイルを作りました。  
<https://msdn.microsoft.com/en-
us/library/windows/desktop/dn481241%28v=vs.85%29.aspx#base.version_helper_apis>

test.manifestファイルの中身：

[code]

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <assemblyIdentity 
        type="win32" 
        name=SXS_ASSEMBLY_NAME
        version=SXS_ASSEMBLY_VERSION
        processorArchitecture=SXS_PROCESSOR_ARCHITECTURE
    />
    <description> my foo exe </description>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel
                    level="asInvoker"
                    uiAccess="false"
                />  
            </requestedPrivileges>
        </security>
    </trustInfo>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
        <application> 
            <!-- Windows 10 --> 
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        </application> 
    </compatibility>
    
[/code]

test.rcの中身：

[code]

    #define SXS_MANIFEST_RESOURCE_ID 1
    #define SXS_MANIFEST foo.manifest
    #define SXS_ASSEMBLY_NAME Microsoft.Windows.Foo
    #define SXS_ASSEMBLY_VERSION 1.0    
    #define SXS_ASSEMBLY_LANGUAGE_INDEPENDENT 1
    #define SXS_MANIFEST_IN_RESOURCES 1
    
    #include "winuser.h"
    1 RT_MANIFEST  test.manifest
    
[/code]

i686-w64-mingw32-windres --input test.rc --output test.res --output-
format=coff

test.cの中身：

[code]

    #define _WIN32_WINNT 0x0601 //win7
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    
    int setOsVer(int setOsVer_i);
    
    int majorv;
    int minorv;
    char osname[36];
    
    int main()
    {
    
    OSVERSIONINFOEX OSver;
    ULONGLONG condition = 0;
    OSver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    
    int i;
    for (i=0; i<8; i++){
        setOsVer(i);
        OSver.dwMajorVersion = majorv;
        OSver.dwMinorVersion = minorv;
        VER_SET_CONDITION( condition, VER_MAJORVERSION, VER_EQUAL);
        VER_SET_CONDITION( condition, VER_MINORVERSION, VER_EQUAL);
    
        if( VerifyVersionInfo( &OSver, VER_MAJORVERSION | VER_MINORVERSION, condition) )
        {
            printf("%s\n", &osname);
            break;
        }
    }
    
    return 0;
    }
    
    int setOsVer(int setOsVer_i)
    {
        switch(setOsVer_i) {
            case 0:
                //windows 2000
                strcpy( osname, "Windows 2000" );
                majorv=5;
                minorv=0;
                break;
            case 1:
                //windows xp
                strcpy( osname, "Windows XP" );
                majorv=5;
                minorv=1;
                break;
            case 2:
                //windows xp professional x64 edition; windows2003server,windows2003serverr2
                strcpy( osname, "Windows XP Professional x64 Edition" );
                majorv=5;
                minorv=2;
                break;
            case 3:
                //windows vista; windowsserver2008
                strcpy( osname, "Windows Vista" );
                majorv = 6;
                minorv = 0;
                break;
            case 4:
                //windows 7; windowsserver2008r2
                strcpy( osname, "Windows 7" );
                majorv = 6;
                minorv = 1;
                break;
            case 5:
                //windows 8; windowsserver2012
                strcpy( osname, "Windows 8" );
                majorv = 6;
                minorv = 2;
                break;
            case 6:
                //windows 8.1
                strcpy( osname, "Windows 8.1" );
                majorv = 6;
                minorv = 3;
                break;
            case 7:
                //windows 10
                strcpy( osname, "Windows 10" );
                majorv = 10;
                minorv = 0;
                break;
            default:
                return 1;
                break;
        }
    
        return 0;
    }
    
[/code]

i686-w64-mingw32-gcc-win32 test.c -o test.exe test.res

これをwindows10で実行すると、  
このアプリケーションのサイドバイサイド構成が正しくないため、アプリケーションを開始できませんでした。  
と書かれたエラーダイアログが出ました。

どうすれば動くようになると思いますか？


CC BY-SA 3.0
2016-05-23T22:26:58.297
25125
2016-05-24T01:55:49.947
2016-05-24T01:55:49.947
4236
13313
question
windows c xml
VerifyVersionInfo関数をwindows8.1以降でも正しく動作させるためのマニフェストファイルの使い方


そもそも`test.manifest`がXMLとして壊れています。  
\- `<assembly>`要素が閉じられていない  
\-
`<assemblyIdentity>`要素の`name`、`version`、`processorArchitecture`属性の値が`""`もしくは`''`で括られていない

その他、[Manifest File Schema](https://msdn.microsoft.com/en-
us/library/aa375635\(v=vs.85\).aspx)としては  
\- `type`属性は必須ではない  
\- `name`属性は必須で何らかの名前が必要（`"MyApplication.app"`ぐらいで可）  
\- `version`属性は必須で適切なバージョン値が必要（`"1.0.0.0"`ぐらいで可）  
\- `processorArchitecture`属性は必須ではない

あたりを修正して次の内容であればマニフェストが正しく認識されるかと思います。

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
      <assemblyIdentity name="MyApplication.app" version="1.0.0.0" />
      <description> my foo exe </description>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" uiAccess="false" />
          </requestedPrivileges>
        </security>
      </trustInfo>
      <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
          <!-- Windows 10 -->
          <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
          <!-- Windows 8.1 -->
          <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
          <!-- Windows Vista -->
          <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
          <!-- Windows 7 -->
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
          <!-- Windows 8 -->
          <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        </application>
      </compatibility>
    </assembly>
    
[/code]


CC BY-SA 3.0
2016-05-24T01:52:26.257
25128
2016-05-24T01:52:26.257
4236
25125
answer