manifestで

解決


マグ  2004-09-30 22:00:53  No: 116657

久しぶりです。

どんなにやってもうまくいきませんから、質問しました。

http://dobon.net/vb/dotnet/control/xpstyle.htmlを見ながら、操作しているのですが
manifestファイルを実行ファイル同ディレクトリーに置いて、WindowsXPスタイルに
することは出来たのですが、
manifestファイルを実行ファイルにリソースで埋め込んでWindowsXPスタイル
にすることが出来ません。

どのように操作すればいいかを分かりません。


特攻隊長まるるう  2004-10-01 21:43:40  No: 116658

>久しぶりです。
相変わらず埋め込み系のビジュアル関連で面白いことやってますね。
ただ、この質問で回答付けづらいのは、やる事を一通りリンク先の
管理者さんが書いてくれてるって事なんです。読んだままです。
回答もそのままコピペになってしまいます。

>manifestファイルを実行ファイルにリソースで埋め込んでWindowsXPスタイル
>にすることが出来ません。
って言っても、リンク先の
>★マニフェストファイルを実行ファイルに埋め込むには
の3番くらいまでは初めてこの内容を読んで、[コントロールの
外観をXPスタイルにする]コードを"試さず"、マニフェストファイル
も"作成してない"ボクでも出来る事ですからね?。どの段階で何が
出来ないのか…
>どんなにやってもうまくいきませんから、
とか書かれても何も伝わらないです。何も書いてないのと
同じです。『どんなにやったか』書いて下さい。

…でないと回答者も最初から全部試さないといけません。
回答者の労力を減らす情報を下さい。何をやろうと思って、
どういう操作をして、どんな状況になって、何が都合が悪い
のか…書いて下さい。
でないと全部の段階でいちいち説明しながらマグさんに確認
して…どこで失敗したか聞き取らないといけません。断言
しましょう。まず、レス付きませんね。

そのあたりの話になるとほとんどの内容を理解してないと回答
できないので過去、同じサンプルを使って最後までテスト
した人しか回答できません。リンク先の管理人さんに聞く
しかない?って話になります(掲示板もあることですし)
リンク先の説明に問題があるならそこも直してもらった方が
良いでしょうしね。

ここの掲示板で聞くなら、もう少し具体的なやった事を
説明して、回答できる人の範囲を広めないと解答つくまで
時間が掛かりますし、つかない事もあるでしょう。


マグ  2004-10-02 04:41:53  No: 116659

リンク先にマニフェストファイルを実行ファイルに埋め込む方法のところが

1.「ファイル」-「開く」-「ファイル...」により、"obj"フォルダ内の"Debug"または"Release"フォルダの実行ファイルを開きます。

2.実行ファイルを右クリックして表示されるメニューから「リソースの追加...」を選びます。

3.「インポート...」ボタンをクリックして、すでに作成してあるマニフェストファイルを選びます。

4.「カスタムリソースの種類」ダイアログで、「リソースの種類」に"RT_MANIFEST"と入力して、「OK」をクリックします。

5.「プロパティ」ウィンドウの「ID」を"1"に変更します。

6.保存して、終了です。

と書かれていましたが、
1番目の方法で実行ファイル(EXEファイル)を開くのが成功して、
2も出来ました。
3も成功しました。
4を操作して、「OK」を押したのですが、
リソースになぜか埋め込む事が出来ず、
マニフェストファイルの「プロパティ」ウィンドウを出す事が出来ずに困っています。


特攻隊長まるるう  2004-10-02 05:21:59  No: 116660

とりあえずボクは OS が 2000 の上に .NET Farmework 1.1
なのでテストできませんが、

http://www.google.com/search?hl=ja&ie=UTF-8&q=.exe.manifest+%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88&lr=

を上から順に…


マグ  2004-10-03 21:43:38  No: 116661

私の開発環境は

OS が XPで .NET Farmework 1.1です。

もしかして、

Farmework 1.1に原因があるような気がします。
一旦ここは解決とさせていただきます。

出来るようになったら、報告します。
特攻隊長まるるうさん  ありがとうございました。


特攻隊長まるるう  2004-10-04 17:56:10  No: 116662

>もしかして、
>Farmework 1.1に原因があるような気がします。
それは調べてないから分からないけど、わざわざ
書いてあるって事は原因の1つになる可能性はある
という事です。
ただ、こちらの環境では、紹介したリンク先の一番上のサイト
(Cですが)RT_MANIFESTという定義済みのリソースタイプ
が見つからないので"24"と入力してしまうという方法で、
インポートは何やら出来たみたい。リストに追加されて
アイテムの追加も出来ました。その後、正常に動作するか?
…のテストは手元に Xp の環境がないので無理です


マグ  2004-10-04 18:16:24  No: 116663

すみません。

そのことについて書き忘れていました。
確かに24と入力してフォルダを追加して、デスクトップ上に作っておいた
MANIFESTファイル自体をインポートすることができなかったため、
コピー&ペーストで内容を貼り付けました。
そして、IDを1にして、動作するかどうかを確認したのですが、
できませんでした。

いろいろ調べて完成したのですが、
ソースは下に書いておきます。

Widows フォーム デザイナーで生成されたコード

のところをクリックして、中身を開いて、

' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

の下に

Application.EnableVisualStyles()

を記載してください。

次に
<Form1_Loadイベントに記述してください。>

        Button1.FlatStyle = FlatStyle.Standard
        'プラットフォームの取得
        'WindowsXPスタイルにするとき、もし、Windows2000以前のバージョンだったら、
        'どうなるか分からない上、こわいので、念のため判断処理を記述
        Dim os As System.OperatingSystem = System.Environment.OSVersion
        If os.Platform = PlatformID.Win32NT Then
            If os.Version.Major = 5 Then
                If os.Version.Minor = 1 Then
                    Button1.FlatStyle = FlatStyle.System
                End If
            End If
        End If

こうなりました。
サンプルは
http://www.geocities.jp/dfgkthug/wwwwwwwwww/XPSample.html
です。

そこでお願いがあります。
私の周りにはXPしかなくて、
Windows2000以前のバージョンではエラーが発生せずに
動くかどうかを確認してもらいたいのですが、
他人任せだとは思いますが、
お願いします。


特攻隊長まるるう  2004-10-04 18:59:32  No: 116664

>確かに24と入力してフォルダを追加して、デスクトップ上に作っておいた
>MANIFESTファイル自体をインポートすることができなかったため、
>コピー&ペーストで内容を貼り付けました。
そこがちょっと違うね。
1. リソースの追加ダイアログで[インポート]を選びマニフェスト
ファイルを選択します。
2. カスタムリソースの種類を聞いてくるダイアログで"24"を入力
して[OK]とします。
3. この時点でダイアログは閉じ、フォルダは追加されませんが、
もう一度[リソースの追加]ダイアログを開くと"24"の項目が追加
されており、リソースの追加が可能な状態になってます。

コピー&ペーストをする必要はありませんでしたが?

[テスト結果]
http://dobon.net/vb/dotnet/system/osversion.html
ここも見たけど同じ結果が出ました。マグさんのコードだと
        Dim os As System.OperatingSystem = System.Environment.OSVersion
        If os.Platform = PlatformID.Win32NT Then            ' 条件を満たす
            If os.Version.Major = 5 Then                    ' 条件を満たす
                If os.Version.Minor = 1 Then                ' 0 のため If 文抜ける
                    Button1.FlatStyle = FlatStyle.System
                End If
            End If
        End If
正常に動作していると思われます。


特攻隊長まるるう  2004-10-04 19:09:18  No: 116665

あ、書き忘れました。
    Application.EnableVisualStyles()
の部分も何もエラーメッセージが出ず、すんなり通って
しまいました。こちらはどうなると正解なのか分かりません。
一応、問題無い感じ…でもどうせなら If 文の中に入れたら…
機能しないのかな?調べてないです。ヘルプを読むと
.NET Framework Version 1.1 が必要と書いてあるので
そこだけ注意すれば良いのではないでしょうか?


マグ  2004-10-04 19:17:12  No: 116666

>1. リソースの追加ダイアログで[インポート]を選びマニフェスト
>ファイルを選択します。
>2. カスタムリソースの種類を聞いてくるダイアログで"24"を入力
>して[OK]とします。
>3. この時点でダイアログは閉じ、フォルダは追加されませんが、
>もう一度[リソースの追加]ダイアログを開くと"24"の項目が追加
>されており、リソースの追加が可能な状態になってます。

私と操作が同じです。
そして、そこからフォルダの中のできたファイルみたいなものに
コピー&ペーストで内容を貼り付けて、IDを1に書き換えて、
保存してWindowXPスタイルになっているかどうかを確認したのですが、
「できなかった」と書いたのですが、説明不足でした。

>正常に動作していると思われます。

ありがとうございました。
もし、エラーがでたら、悲劇でした。


マグ  2004-10-04 19:18:56  No: 116667

解決を押し忘れました。

とりあえず、目的は成功したので。


マグ  2004-10-04 20:09:45  No: 116668

READ MEに

「.NET Framework Version 1.1をインストールしてください。」
っと書けば、大丈夫かな?


特攻隊長まるるう  2004-10-04 21:10:28  No: 116669

>「.NET Framework Version 1.1をインストールしてください。」
>っと書けば、大丈夫かな?
書くのは良いとして、OS のバージョン調べたんなら .NET Framework
のバージョンも調べれば?
例えば
http://dobon.net/vb/dotnet/system/runtimeenvironment.html
とか…
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsintro7/html/vxconLaunchConditionManagementInDeployment.asp
とか…


マグ  2004-10-05 01:42:36  No: 116670

ランタイムを調べるにはこのこのようなソースでよろしいのでしょうか?

        Dim rantaimu As String
        Dim cut As Integer = -1
        Dim kurikaesi As Integer
        rantaimu = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion()
        'ランタイム:V1.1.4322
        For kurikaesi = 0 To 1
            cut = rantaimu.IndexOf(".", cut + 1)
        Next
        If cut <> -1 Then
            rantaimu = rantaimu.Substring(1, cut - 1)
            'ランタイム:1.1
        End If
        If rantaimu <> "1.1" Then
            MessageBox.Show("このランタイムでは、正常に動かない場合があります。")
            Exit Sub
        End If

動作確認はしていますが、
ランタイムのバージョンに関してはあまり詳しくないので、
このようなソースで大丈夫かどうか不安です。
何度も何度も質問して、すみません。


raki  URL  2004-10-05 02:47:42  No: 116671

横から申し訳ありませんが、
私の環境(WinXP VB.NET2003)で以下のように行ったら
manifestファイルを実行ファイルにリソースで埋め込んで
WindowsXPスタイルにできましたので、その手順を記します。

まず、文字コードUTF-8でmanifestファイルを作成しておいて下さい。

1.[ファイル]⇒[開く]⇒[ファイル]で実行ファイルを選択
2.実行ファイルを右クリック⇒[リソースの追加]をクリック
3.[カスタム]をクリックし、『リソースの種類』に"RT_MANIFEST"を入力して[OK]クリック
4.追加されたファイル(RT_MANIFESTフォルダ内)のIDを"1"に変更し、ダブルクリックして開く
5.manifestファイルの中身をコピーペーストしてタブを右クリックして「...exeの保存」を選択して保存

これで保存してexeを実行したところ、私の環境ではXPスタイルで
表示されていました。


特攻隊長まるるう  2004-10-05 03:29:08  No: 116672

・RT_MANIFEST のその後
>定数の使用にはWindowsXp対応のSDKが必要です。
とか
>最新のPlatform SDKで定義されているリソースタイプ(RT_MANIFEST)とリソースIDを使用します。
という記述は見つけました。結構同じようなサンプルが大量に検索できるので
マニフェストファイルでもどうにかできる筈なんでしょうね。リソースタイプが
使えるようになる為に何かが必要なんでしょう。

・バージョン番号
.NET Framework に限らず、基本的に、バージョン番号と言えば、ピリオド(.)
で区切られた4つのパート(属性)で構成されています。
>[メジャー・バージョン].[マイナー・バージョン].[ビルド番号].[リビジョン]
このうちユーザーに提示するバージョン番号は、メジャー・バージョンとマイナー・
バージョンを組み合わせた番号になります。
[参考]
http://www.atmarkit.co.jp/fdotnet/dotnettips/187asmverinfo/asmverinfo.html

で、その2つの部分が比べられればコードはどんなのでもいいと思います。
…しかし頭の"v"って邪魔ですよねw。フォルダ名とかに使われてるから、
数字始まりのものを使うのが気持ち悪かったんじゃないか?と邪推してますが
…バージョン比較では付いてる方が気持ち悪い…。これからずっと頭に"v"
が付きます…とかいう記述を検索してみましたが…まぁ、引っ掛からないですね(^^;)

たまにベータ版とか言って 1.0b とか言うバージョンを出したりするので
もっと汎用性のある(1.1以降とか?)に対応させるなら、数値だけ切り出して
…って処理があっても良いかもしれないけど、動作確認してる v1.1 のみ
対象にしてるなら十分じゃないでしょうか?。
>ランタイムのバージョンに関してはあまり詳しくないので
ボクも良く知りません(汗)。


マグ  2004-10-06 01:55:15  No: 116673

>1.[ファイル]⇒[開く]⇒[ファイル]で実行ファイルを選択
>2.実行ファイルを右クリック⇒[リソースの追加]をクリック
>3.[カスタム]をクリックし、『リソースの種類』に"RT_MANIFEST"を入力して[OK]クリック
>4.追加されたファイル(RT_MANIFESTフォルダ内)のIDを"1"に変更し、ダブルクリックして開く
>5.manifestファイルの中身をコピーペーストしてタブを右クリックして「...exeの保存」を選択して保存

rakiさん  ありがとうございます。
リソースに埋め込んで、成功しました。

完成しました。

[方法]

まず、rakiさんの方法でリソースにmanifestファイルを埋め込んで、
あとは、私の作ったこのソースで・・・

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ALLCALL()
        Dim rantaimu As String
        Dim cut As Integer = -1
        Dim kurikaesi As Integer
        rantaimu = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion()
        'ランタイム:V1.1.4322
        For kurikaesi = 0 To 1
            cut = rantaimu.IndexOf(".", cut + 1)
        Next
        If cut <> -1 Then
            rantaimu = rantaimu.Substring(1, cut - 1)
            'ランタイム:1.1
        End If
        If rantaimu < 1.1 Then
            'ランタイムがFreamWork1.0以前のバージョンはWindowsXPスタイルに出来ないため、
            'Form_Loadイベントを終了
            MessageBox.Show("このランタイムでは、正常に動かない場合があります。")
            Exit Sub
        End If
        'プラットフォームの取得
        'WindowsXPスタイルにするとき、もし、Windows2000以前のバージョンだったら、
        'どうなるか分からない上、こわいので、念のため判断処理を記述
        Dim os As System.OperatingSystem = System.Environment.OSVersion
        If os.Platform = PlatformID.Win32NT Then
            If os.Version.Major = 5 Then
                If os.Version.Minor = 1 Then
                    XPMode()
                End If
            End If
        End If
    End Sub
    Private Sub ALLCALL()
        'Form_Load時に必ず呼び出されます。
        'ここは見本としてはWindows2000以前のバージョンの対しての記述をしています。
        Button1.FlatStyle = FlatStyle.Standard
    End Sub
    Private Sub XPMode()
        'ここにはWindowsXPのみサブルーチンで呼び出されます。
        Button1.FlatStyle = FlatStyle.System
    End Sub

と入力すれば、完成です。

         [感想]

WindowsXPスタイルにするだけで、こんなにソースが長くなるとは思いませんでした。

特攻隊長まるるうさん  答えてくださってありがとうございました。

そして、疑問点が・・・
このソースではFreamWork1.1以降のバージョンだったら、WindowsXPスタイルにするように
プログラムを組んでいますが、

この先、FreamWork1.5とかFreamWork2.0のバージョンが出てきたら、このソースで
WindowsXPスタイルで表示してくれるでしょうか?
っという疑問点ですが、分かる方、いますでしょうか?


raki  URL  2004-10-06 13:56:23  No: 116674

私の環境には.NET Framework 2.0 Betaが入っていますが、
正常にWinXPスタイルで表示されました。
(リソースに埋め込み、上記ソースをコピーペーストし、
  ALLCALLとXPModeの中を私のEXEのフォーム上のコントロール名に変えて
  実行しました)

また、この環境でSystem.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion()で
取得できる値を調べてみたところ、
V1.1.4322でした。
どぼんさんの以下のページにもあるように
http://dobon.net/vb/dotnet/system/runtimeenvironment.html
RuntimeEnvironment.GetSystemVersionメソッドは
『現在のプロセスを実行している共通言語ランタイムのバージョン番号を取得できます。』
とあります。

また、VB.NETの[プロジェクト]メニュー⇒[...のプロパティ]を選択し、
[共通プロパティ]⇒[ビルド]の項目画面の下のほうに
『サポートされているランタイム』という設定項目があり、
ビルド時の.NET Frameworkのバージョンを指定することができます。

このことから、別のバージョンの.NET Frameworkがインストールされていようと、
.NET Framework 1.1さえインストールされていれば、
実行ファイルは自分がサポートしているバージョンのランタイムで実行されるのではないでしょうか。
(きちんと調べていないので、違っていたらすみません)


raki  URL  2004-10-06 14:01:00  No: 116675

書き忘れていました。
誤解を招きかねないので、追記します。

私の環境は
WinXP SP1 で、
作成したEXEは Visual Studio .NET 2003 にて作成
(.NET Framework 1.1にてビルド)
開発環境及び実行環境には
.NET Framework 1.1と.NET Framework 2.0 Betaが入っております。
VB.NET 2005も入ってるんですけどねw

そういえば、VB.NET 2005で同じことできるのだろうか・・・
試してみます。


マグ  2004-10-06 23:01:45  No: 116676

私もFreamWork関係にはあまり詳しくありませんので、
今のところはこれでいいと思います。
不具合がでたら、修正すればいいだけですし・・・

VB.NET 2005も操作はそんなに変わらないと思います。
.NET系だから・・・

VB.NET 2005は持ってませんが・・・
全然、違いましたら、ごめんなさい。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加