サンプルをビルドしてみる 2

はじめに

sixaxisdriverには、このドライバを使用してsixaxisの情報を取得するサンプルが別途配布されています。
何をするにもまずはサンプルの解析です。
解析するには手に入れてコンパイル・実行が出来るようになる必要があります。
しかし、このサンプルVisualC++6.0で作成されたのか(確認はしていない)Visual C++ 2008 EEでは簡単にはコンパイル出来ません。
結構苦労しましたが、コンパイル成功してました。

さてここまではその1でやったわけですが、今回は少し違う方法でやってみました。

やり方を忘れる確立が高いので今回も、ダウンロードからビルドまで手順を整理してみました。

ダウンロード

今回はVisualC++ 20008 EEを使うのでダウンロードして、インストールしておきます。
[Visual Studio 2008 Express Editions]ダウンロードサイト
http://www.microsoft.com/japan/msdn/vstudio/Express/

sixaxisdriverも入れておいてください。

ではサンプルをダウンロードします。

  1. [CodeProject: Wired PS3 Six Axis Controller Using USB HID as Input. Free source code and programming help](http://www.codeproject.com/KB/mcpp/wiredps3axis.aspx) にアクセスします。
  2. Download demo application including source - 50.15 KB」をクリックしてPS3SampleApp.zipをダウンロード。

解凍したファイルは、VC++2008EEのProjectsフォルダなど作業しやすい場所に入れておきます。

とりあえず開いて中身を確認

\ddk … hid.libとかが入っています。ここは特に触らずこのままで。
\usbps3 … 本体です。このフォルダを開きます。

今回必要なのは

  • \ddkフォルダとその中身
  • icon1.ico
  • resource.h
  • usbps3.cpp
  • usbps3.h
  • usbps3.rc

以上。

残りのファイルは削除してかまいません。

新規でプロジェクトを作る

新規にプロジェクトを作ります。
手順はこんな感じです。

  1. VC++2008EEを起動する。
  2. ファイルメニュー → 新規作成 → プロジェクト
    → 新しいプロジェクトダイアログが開く。
  3. 次のように設定する。
    プロジェクトの種類:全般
    テンプレート:Win32アプリケーション
    プロジェクト名:ps3mktest←(これは自由に変えてかまいませんが、説明の都合ためこれにしてます。)
  4. okクリック。
    → メイクファイルプロジェクトウィザードが開く。
  5. 次へ。
  6. 空のプロジェクト
  7. 完了。
    → プロジェクトのフォルダが作成されます。

サンプルをコピーする

プロジェクトを1から作りましたが、スクリプトまで作る気はさらさらありません。
さくっとコピーしてきます。

作成したプロジェクトのフォルダに、PS3SampleAppからddkフォルダをコピーします。
ddkフォルダの中身

  hid.lib
  hidpi.h
  hidsdi.h
  hidusage.h

これらのファイルはWDKをインストールすれば、入手できると思うのですが…環境設定がまずいのか 上手くいかないのでサンプルのものを使います。

次に、作成したプロジェクトのフォルダ内にあるps3mktestフォルダに、 PS3SampleAppから

  usbps3.cpp
  usbps3.h
  resource.h
  usbps3.rc
  icon1.ico

をコピーします。
これでサンプルにはもう用はありません。

コピーしたファイルを読み込む

usbps3.cpp

  • ソリューションエクスプローラタブのツリーからソースファイルを右クリック。
  • 追加 → 既存の項目
  • usbps3.cppを選択して、追加をクリック。 ソースファイルの下にusbps3.cppが作成されます。

usbps3.h、resource.h

  • ソリューションエクスプローラタブのツリーからヘッダーファイルを右クリック。
  • 追加 → 既存の項目
  • usbps3.hを選択して、追加をクリック。 ヘッダーファイルの下にusbps3.hが作成されます。
  • 同様に、resource.hも追加する。

usbps3.rc、icon1.ico

  • ソリューションエクスプローラタブのツリーからリソースファイルを右クリック。
  • 追加 → 既存の項目
  • usbps3.rcを選択して、追加をクリック。 ヘッダーファイルの下にusbps3.rcが作成されます。
  • 同様に、icon1.icoも追加する。

これでコピーしたファイルをプロジェクトに読み込みました。

afxres.hを用意する

afxres.hはWDKをインストールすれば入っているはずなんですが、 これも環境設定がまずいのか上手く動きません。

1>.\usbps3.rc(10) : fatal error RC1015: cannot open include file 'afxres.h'.

仕方ないので作ることにします。

afxres.h

  • ソリューションエクスプローラタブのツリーからヘッダーファイルを右クリック。
  • 追加 → 新しい項目
  • 「ヘッダーファイル(.h)」を選択。
  • ファイル名にafxresと入力して追加をクリック。
    空のヘッダーファイルの下にafxres.hが作成されます。
  • afxres.hを開いて次の2行を書く。
    #include <windows.h>
    #define IDC_STATIC      (-1)
    
  • 上書き保存しておきます。

これで、afxres.hが無いというエラーは出なくなります。

ライブラリをリンク

ここからはusbps3.cppを編集していきます。

まずはライブラリをリンクします。
今回はプロジェクトのオプションからではなく、コード上から行います。
最初の行あたりに以下を追加します。


#pragma comment (lib, "odbc32.lib")
#pragma comment (lib, "odbccp32.lib")
#pragma comment (lib, "comctl32.lib")
#pragma comment (lib, "setupapi.lib")
#pragma comment (lib, "..\\ddk\\hid.lib")

hid.libはWDKをインストールすれば入ってるはずなんですが(以下略
#pragma comment (lib, "hid.lib")
と行きたいところを相対パスで指定しています。

参考資料

エラーを無視する

scanfやprintfが、scanf_sやprintf_sになった関係で、sprintfなどを使っていると警告が出ます。
サンプルではsprintfを使っているのでこのままではたくさん警告が出てしまいます。

コンパイルしています...
usbps3.cpp
c:\(省略)\visual studio 2008\projects\ps3mktest\ps3mktest\usbps3.cpp(135) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。
c:\(省略)\visual studio 2008\projects\ps3mktest\ps3mktest\usbps3.cpp(141) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。
…

sprintfの行をsprintf_sの書式に書き換えると言うのもひとつの方法です。
しかし今回の場合は量が多い上に、使っている部分はスクリプトの本体部分には直接関係のない表示の部分だけです。
ということで、なんとかして警告を無視する方法をやります。

調べたところによると、コンパイラのプリプロセッサオプションで _CRT_SECURE_NO_DEPRECATE マクロを定義すると警告を出さなくなるそうです。
わけ分からないですね。
とにかくこの手の警告を無視するようになるマクロだそうです。

usbps3.cppの適当な場所で、次のように記述します。


#define _CRT_SECURE_NO_DEPRECATE 1

さっき書いた「#pragma...」の次の行でいいでしょう。
これで一気に警告が減ります。

文字セットの設定を変える

VC++2008EEではVC++6時代とは異なり、文字セットのデフォルト値がUnicode文字セットになっています。
そのため、そのままビルドしようとすると、次のようなエラーが出ます。

コンパイルしています...
usbps3.cpp
c:\(省略)\visual studio 2008\projects\ps3mktest\ps3mktest\usbps3.cpp(219) : error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [33]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
    指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
…

2005以降に文字列関係の扱いが厳密になったそうで、VC+++系の質問にもよく上がっている問題のようです。
コード上からはめんどくさそうなので、VC++2008EEの設定の方を変更します。

  • プロジェクトメニュー → プロパティ
    → プロパティページが開く。
  • 構成プロパティ → 全般 → 文字セット
  • 「Unicode文字セットを使用する」→「設定なし」又は「マルチバイト文字セットを使用する」に設定。
    → 「マルチバイト文字セットを使用する」に設定。
  • OKをクリックして閉じる。

文字セットの設定を変える以外の方法

スクリプトの方を書き換える方法も書いておきます。
_Tマクロを使用します。

先ず、
#include <TCHAR.h>
として、TCHAR.hをインクルードしておきます。

次に、「'LPCWSTR' に変換できません。」エラーが出た行の文字列部分を1個ずつ書き換えます。
例えばこんな感じ。

MessageBox(NULL, "Failed to Initialize Application", "Failure!", MB_ICONSTOP);

これをこうします。↓

MessageBox(NULL, _T("Failed to Initialize Application"), _T("Failure!"), MB_ICONSTOP);

これでおおよそのエラーが消えると思います。
でもあと1個ありますね。

usbps3.cpp
c:\(省略)\visual studio 2008\projects\ps3mktest\ps3mktest\usbps3.cpp(539) : error C2664: 'SetDlgItemTextW' : 3 番目の引数を 'char [1024]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
    指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

char型からLPCWSTR型に変換できない!ってことらしいです。
この行を

SetDlgItemText(hDlg, IDC_INFO, (msgstring) );

こうすると上手く通りました。

SetDlgItemText(hDlg, IDC_INFO, LPCWSTR(msgstring) );

いいか悪いかはともかく。

これでエラーが出なくなったと思います。
やり方としては設定を変えるよりよいのかもしれません。

参考資料:
_T("")マクロだのL""マクロだのLPCTSTRだのの世界一詳しい解説
http://fatalita.sakura.ne.jp/3DLib/Ref/_T/


ちなみに、TCHAR.hをインクルードせずにこうしてもエラーが出なくなります。
MessageBox(NULL, TEXT("Failed to Initialize Application"), TEXT("Failure!"), MB_ICONSTOP);
上手くいってますが、このやり方はどうなんでしょうね?

ビルド!

ここまで出来たらビルドしてみます。

ビルドメニュー → ソリューションのビルド

========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

と出たら成功です。

  • sixaxisをusbで接続。
  • デバッグメニュー → デバッグ開始
    → 成功すると、sixaxisの信号を取得して結果を表示します。

ボタンを押したり、sixaxisを傾けたりして楽しんでください。

終わりです

いかがだったでしょうか、この記事SIXAXISと全然関係ないですね。
サンプルがたまたまSIXAXISのサンプルだったと言う感じで…、ほとんどVC++からVC++2008EEへの移植作業でのトラブル対策です。
まあ、これはこれで役に立ちそうなんでいいんですが。
前回のその1とあわせて読むといいかもしれませんね。

うーん。SIXAXISの作業なかなか進まない…。

関連記事

  1. SIXAXISのおおざっぱ説明 SIXAXISについて 家庭用ゲーム機PLAYSTATION...
  2. とりあえずSIXAXISを使えるようにする とりあえず HSPでSIXAXISの情報を取得できるようにす...
  3. サンプルをビルドしてみる はじめに sixaxisdriverには、このドライバを使用...
  4. SIXAXISについて ~ハード編~ SIXAXISについて 今回は、プログラミングから離れてハー...
  5. SIXAXISについて ~データ編~ SIXAXIS Driver から送られてくるデータ SIX...
  6. SIXAXISの情報を取得するサンプル解説 for HSP スクリプトについて解説 サンプルスクリプトについて少し解説し...
  7. 加速度センサーからの取得値の処理 加速度センサーとこれまでのボタンの違い SIXAXISについ...
  8. DirectInputに挑戦してみた オワタ SIXAXISの加速度センサ等の情報をDirectI...
  9. プラグインに挑戦してみた プラグインに挑戦してみた HSP3用のプラグイン作成に挑戦し...