無料ブログはココログ

« 2017年1月 | トップページ | 2017年3月 »

2017年2月26日 (日)

同じSDKで新しいSDKを入れても古いSDKが適応される場合の対処方法

Xtreme ToolkitPro に限らずですが、同じ SDK でも後から新しいバーションをインストールすると、古いバージョンの SDK がインクルードされたりする場合があります。
これは VisualStudio の設定に古いバージョンの SDK のインクルード先が記述されているためです。原因は SDK のインストーラによる問題の場合が多いです。

一番いいのは古い SDK をアンインストールすることですが、場合によってはビルド不安定にしかねなかったり、メンドクサイ等があります。その SDK にバージョンを管理するマネージャがあれば一番いいのかもしれませんがそういう SDK は滅多にありません。

Xtreme ToolkitPro を例に説明します。Xtreme ToolkitPro の v17.2.0 をインストールした後に v17.3.0 をインストールした場合です。

Xtreme ToolkitPro では後から新しいバージョンの SDK をインストールしても古いバージョンがインクルードされてしまうことがあります。
これを直すにはいくつか設定を変更する必要があります。

まずプロジェクトのプロパティを開きます。
VC++ ディレクトリの項目を見ると赤枠で囲った部分が古い SDK(17.2.0) の場所が記述されています。その後に 17.3.0 の記述があります。17.2.0 は不要なので 17.2.0 の部分を削除します。これを Debug、Release、x64、Win32 の組み合わせのすべて設定を変更する人用があります。

Sdk_folder_01


次に VisualStudio の設定を変更します。
C:\Users\各ユーザー名\AppData\Local\Microsoft\MSBuild\v4.0
のフォルダ内に
Microsoft.Cpp.x64.user.props
Microsoft.Cpp.Win32.user.props
という二つの XML ファイルがあります。

Sdk_folder_02


これをテキストエディタで開くと、

Microsoft.Cpp.x64.user.props

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup />
  <PropertyGroup>
    <SourcePath>$(SourcePath);D:\SDK\Xtreme ToolkitPro v17.2.0\Source;D:\SDK\Xtreme ToolkitPro v17.3.0\Source</SourcePath>
    <LibraryPath>$(LibraryPath);D:\SDK\Xtreme ToolkitPro v17.2.0\Lib\vc120x64;D:\SDK\Xtreme ToolkitPro v17.2.0\Lib\vc140x64;D:\SDK\Xtreme ToolkitPro v17.3.0\Lib\vc120x64;D:\SDK\Xtreme ToolkitPro v17.3.0\Lib\vc140x64</LibraryPath>
    <IncludePath>$(IncludePath);D:\SDK\Xtreme ToolkitPro v17.2.0\Source;D:\SDK\Xtreme ToolkitPro v17.3.0\Source</IncludePath>
  </PropertyGroup>
  <ItemDefinitionGroup />
  <ItemGroup />
</Project>

Microsoft.Cpp.Win32.user.props

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup />
  <PropertyGroup>
    <SourcePath>$(SourcePath);D:\SDK\Xtreme ToolkitPro v17.2.0\Source;D:\SDK\Xtreme ToolkitPro v17.3.0\Source</SourcePath>
    <LibraryPath>$(LibraryPath);D:\SDK\Xtreme ToolkitPro v17.2.0\Lib\vc120;D:\SDK\Xtreme ToolkitPro v17.2.0\Lib\vc140;D:\SDK\Xtreme ToolkitPro v17.3.0\Lib\vc120;D:\SDK\Xtreme ToolkitPro v17.3.0\Lib\vc140</LibraryPath>
    <IncludePath>$(IncludePath);D:\SDK\Xtreme ToolkitPro v17.2.0\Source;D:\SDK\Xtreme ToolkitPro v17.3.0\Source</IncludePath>
  </PropertyGroup>
  <ItemDefinitionGroup />
  <ItemGroup />
</Project>

上記のようにこちらにも古いバージョンの 17.2.0 が記述されています。
これも消去します。
Visual Studio 2015 を立ち上げ直してリビルドすると新しい SDK が適応されるようになります。

2017年2月19日 (日)

MFCリボンアプリでいつのまにかリボン上のコントロールが使えなくなっている場合の原因と対処方法

MFC でリボンアプリを作っているといつのまにか配置したボタンなどコントロールが無効になっている場合があります。

Ribbon_redid2_2

Ribbon_redid1_3

これが起きるのは resource.h ファイルの該当するコントロールの ID の数値を変更した場合に発生します。自分なんかは ID の整理は作成中はよく行います(リリース後は行いません)。今までようなツールバー・メニューバーのアプリを作っている場合では問題ありませんでしたが、リボンアプリの場合は事情が異なります。

MFC のリボンアプリでは、リボンリソースは *.mfcribbon-ms ファイルに記述されています。ファイルの中身を見るとリボンは XML で記述されています。

上図の例では resource.h ファイルの ID_WINDOW_MANAGER を変更した場合に発生しています(例では 131 から 13100 に変更しました)。

Ribbon_redid3_2

リボンの定義ファイル( *.mfcribbon-ms )をテキストエディタで ID_WINDOW_MANAGER を探すと下図のようになっており ID が一致しません。

Ribbon_redid4_2

この不一致のためリボンのコントロールが無効となってしまいます。修正方法は簡単で resource.h のリボンに関わる ID を変更したら、*.mfcribbon-ms 内の該当のコントロールの ID も同じ値に変更し、ビルドすると直ります(リビルドしておいたほうがいいかも)。

なぜリソース ID を二重持ちにしているのかが謎です。

« 2017年1月 | トップページ | 2017年3月 »