無料ブログはココログ

2017年3月11日 (土)

MySQL Connector/C++ を Visual Studio でビルドする

備忘録です。このメモでは目的の lib と DLL はできますが、ライブラリ以外のプロジェクトでエラーがでます。

MySQL のサイトにある MySQL Connector/C++ の lib と dll ファイルでは相変わらず落ちてしまいます。そこで MySQL Connector/C++ のソースコードをダウンロードしてきて自分でビルドしたものを使用すれば落ちなくなります。

まず CMake が必要になるのでインストールします。環境変数のパスは設定しなくても大丈夫です。ここでは例として CMake のインストール先を下記のようにしました。

C:\Program Files\Tools\CMake

MySQL Connector/C++ のソースコードをダウンロードして展開します。下記のフォルダに展開したものとします。

D:\SDK\mysql-connector\mysql-connector-c++-1.1.8

MySQL 本体も必要です。zip でダウンロードしたものを下記のフォルダに展開したものとします。

D:\SDK\mysql-connector\mysql-5.7.17-winx64

Boost ライブラリも使用します。

D:\SDK\boost_1_61_0

MySQL Connector/C++ のフォルダを開いて CMakeLists.txt をテキストエディタで開きます。

そのまま CMake を走らせてしまうと、timespec 構造体が再定義エラーとなってしまうので定義済みとして DHAVE_STRUCT_TIMESPEC フラグをセットします。Windows 系限定の問題だそうで、

適当なところに

IF(WIN32)
    ADD_DEFINITIONS(-DHAVE_STRUCT_TIMESPEC)
ENDIF(WIN32)

と書いておけば大丈夫のようです。Windows 限定なら IF(WIN32)、ENDIF(WIN32) もいりません。

CMake のコマンドは以下の通りです。画面の都合上改行していますが、コマンドなので一行で書いてください。

"C:\Program Files\Tools\CMake\bin\cmake"
-G "Visual Studio 14 2015 Win64"
-DBOOST_ROOT:STRING="D:/SDK/boost_1_61_0"
-DMYSQL_INCLUDE_DIR="D:\SDK\mysql-connector\mysql-5.7.17-winx64\include"
-DMYSQL_LIB_DIR:STRING="D:\SDK\mysql-connector\mysql-5.7.17-winx64\lib"

CMake を動かすと Visual Studio のソリューションファイルが出来上がります。これをビルドすると複数のプロジェクトでエラーは出ますが、目的のライブラリのプロジェクトはビルドが通り、この例では下記のフォルダに lib と DLL ファイルが出来上がります。

D:\SDK\mysql-connector\mysql-connector-c++-1.1.8\driver\Debug

上記は Visual Studio 2015 の例ですが、ヘルプで Visual Studio のバージョンの書き方が確認できます。

"C:\Program Files\Tools\CMake\bin\cmake" --help

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月24日 (火)

Codejock Xtreme ToolkitPro で AppWizard を VisualStudio 2015 に追加する方法

  Xtreme ToolkitPro は MFC の拡張フレームワークです。

  今でこそ VisualStudio が標準でドッキングフレームやリボンをサポートしていますが、標準で実装される前に早くから実装されています。では標準で実装されているからといって必要ないということでもなく、Xtreme ToolkitPro でやったほうがいろいろ便利な場合があります。例えばプロパティグリッドの拡張のし易さがあります。また標準では VARIANT 型を扱うことが多いようで、個人的には VARIANT 型は可能な限り使いたくありません。個人で扱うにはよいのですが、多人数で扱うと VARIANT 型扱いがそれぞれになってしまいロクなことがないからです(体験談)。

  Xtreme ToolkitPro は型指定が決まってるので、個人的にはこっちのほうが好みです。とはいえ標準ではない故に不便なことも多いです。例えばリボンリソースエディタが利用できない点です。正確には使えますが手動でいろいろ手を加えないとなりません。また AppWizard が VisualStudio 2012 までしか用意されていない点です。もしかしたら日本語環境にインストールしたので使えないだけかもしれませんがインストールフォルダを見ても vc110 までのフォルダしかありません。

  そこで VisualStudio 2015 でも Xtreme ToolkitPro の AppWizard を使えるようにします。前置きは長いですが作業はほんの少しです。

  Xtreme ToolkitPro をインストールしたフォルダの AppWizard があるフォルダを開きます。

例) D:\SDK\Xtreme ToolkitPro v17.3.0\Utils\AppWizard

  AppWizard フォルダに vc110 という VisualStudio2012 用のウィザードフォルダがあるので、これをコピーして vc140 にリネームします。リネームした vc140 フォルダ内の vcProjects フォルダに XTPAppWizard.vsz というファイルがあるのでテキストエディタで開きます。

Wizard=VsWizard.VsWizardEngine.10.0

となっている部分を以下のように書き換えます。

Wizard=VsWizard.VsWizardEngine.14.0

  保存したら vcProjects フォルダ内のすべてのファイルを C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcprojects へコピーし、vcWizards フォルダ内の XTPAppWizard フォルダを C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCWizards にフォルダごとコピーします。

以上です。

  注意点は XTPAppWizard.vsz の中身を書き換える作業を VisualStudio がインストールされている先では行わないでください。必ず Xtreme ToolkitPro がインストールされているところで行ってください。正確にはマイドキュメントでもどこでも構いませんが、結果として XTPAppWizard.vsz ファイルを編集してからコピーするようにしてください。Windows10 では Program Files 内のファイルを編集しようとすると巻き戻されたりするのでよろしくありません(ウィルス対策ソフトのせいかもしれませんが)。

  これで VisualStudio 2015 で Xtreme ToolkitPro の AppWizard が機能するようになりますが、このウィザードで作成されたプロジェクトをビルドしようとしても C1189 エラーが出ます。サポートバージョンが古く設定されてしまっているので、適当な MFC アプリケーションを作成して、targetver.h ファイルをコピーし、stdafx.h を比べて、WINVER、_WIN32_WINNT、_WIN32_WINDOWS、_WIN32_IE 等がある部分を #include "targetver.h" に変更してください。これでビルドが通るようになります。

  ちなみに AppWizard は古いままなので、標準でリボンアプリを作成することができません。早く対応してほしいところですが、vc110 から変わらないところから期待はしない方がいいでしょう。\Samples\Ribbon をコピーして作業するほかなさそうです。

Appwizard

2016年12月30日 (金)

MFC の DirectX12 プログラミングで d3d12.lib リンクエラー。

これも備忘録。

MFC プログラミングに限った話ではありませんが、VisualStudio2015 から MFC プロジェクトを作成し、DirectX12 のプログラムを書いてビルドしようとすると、

1>LINK : fatal error LNK1104: ファイル 'd3d12.lib' を開くことができません。
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========

と出る場合があります。これは使用する SDK のバージョンが合っていないためです。

これを修正するためにはソリューションエクスプローラで対象のプロジェクトを右クリックし、表示されたポップアップメニューから「SDK バージョンの再ターゲット」を選択します。

2

「SDK バージョンの再ターゲット」が選択されると下図のような SDK 選択ダイアログが表示されるので、Windows10 以降のバージョン(10.0.10240 以降)を指定します。

3_2

OK ボタンを押してプロジェクトをリビルドすればリンクエラーは出なくなるはずです。

2016年12月11日 (日)

VisualStudioの出力ウィンドウでスレッド終了メッセージを表示させない方法

備忘録。すっかり忘れてたので。

VisualStudio の出力ウィンドウを見ていると

「スレッド 0x38e4 はコード 0 (0x0) で終了しました。」

のようなログが出ることがあります。数も多くないので今まであまり気にしていませんでしたが、DirectX12 の D3D12ExecuteIndirect のサンプルを実行すると、数のようにスレッド終了メッセージが大量に出力されて大変なことになってしまいます。

Vsoutput

これではログを追えないので、ウィンドウ内で右クリックするとポップアップメニューが表示され、出力を抑制できる項目が出てくるので必要に応じてチェックボックスを外します。

ここでは「スレッド終了メッセージ」のチェックを外します。

Vsoutput2

その状態でデバッグ実行するとスレッド終了メッセージは表示されなくなります。

Vsoutput3


2011年4月12日 (火)

ExtFloodFill メモ

ExtFloodFill 関数を FLOODFILLSURFACE で使用するとき、第 4 パラメータの色は塗り潰し対象の色。

( nXStart, nYStart )の色が第 4 パラメータの色でなければ塗り潰しの処理が行われない。

関数の戻り値も FALSE で返ってくる。ただし GetLastError は正常終了を示す。

2010年12月 8日 (水)

VisualStudio と MFC

どうにも、ここ 2、3 週間体調が良くない。睡眠をもっと多めに取れば大丈夫かな。

で、本題。自分の中では MFC は現役。本当ならば C# に移行したいところだけど、仕事内容が組み込み系と同じ部類になるので C++ からは離れられない。そうなると UI 付きツールを作成するためには MFC が必要になる。

UI は .net 系ほど多くはないので大変だけれども、VisualStudio2008 の ServicePack あたりから豊富な UI 群が追加された。統合系ツール作るのには非常に助かる。

ただ困ったことにドキュメントビューアーキテクチャを使用することを前提にされたウィザード設定が多く、特にリボンを使いたいときなんかはドキュメントビューアーキテクチャは必須になってしまっている。

個人的にはドキュメントビューアーキテクチャは見づらいのと、データ管理は独自に分離して管理できているので必要がない。なのでドキュメントビューアーキテクチャを切り離せた設定ができないと非常に困る。

VisualStudio に追加された UI 群は BCG という会社ところの簡易版の OEM のようである。ここのライブラリは昔ちょっと触ったことがあるが、あまり使いやすいとは思えなかった印象がある。ただ以前とは自分の考え方も変わっているので、今使うと使いやすかったりするのかもしれない。今自分はどうしているかというと別の UI 群(有料)を使っている。ドキュメントビューアーキテクチャも切り離せて使えるのが便利なので愛用している。ただメンテナンスを考えると無料で追加された同じような UI 群は非常にコストパフォーマンスはいい。

ただ個人的には有料でも使いやすいライブラリがあって、かつユーザーにも有益ならば、今自分が使っているライブラリの価格などは無料に等しいと思っている。さてこれを周りに説明して納得してくれる人がと゜れくらいいるだろうか。

2010年4月16日 (金)

VisualStudio2010 と PhotoshopCS5

VisualStudio2010PhotoshopCS5 が立て続けに発表された。

VisualStudio2010 は仕事内容的に今すぐ必要なわけではないが、いずれ買わなければならないのと、先行して機能を覚えておく必要があるので買わなければならならい。

PhotoshopCS5 は現在持っているバージョンが CS2 なので、バージョンアップ可能世代の最下位なので強制的にバージョンアップしなければならない。64ビットネイティブ対応や Windows7 正式対応もその理由。

両方合わせて 10 万円だろうか・・・。痛い。

2010年3月17日 (水)

Windows Phone 7 SDK

Windows Phone 7 用の開発キットのβ版が無償で配布されるそうな

最終的に有料になるかはどうかは分からないけど、それよりも気になるのがインストール方法がマーケットプレースのみという点。

オレ専用アプリとか作った場合は、開発中アプリとしてずっと登録しておけばいいのかな ?