はじめに

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

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

ダウンロード

今回は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 … 本体です。このフォルダを開きます。

\usbps3\Releaseに、サンプルusbps3.exeが入っています。
sixaxisdriverが正常に入っていれば、これをそのまま実行するとsixaxisの情報を取得して表示してくれます。
付属のスクリプトはこのソフトのものです。
このままだと上書きされそうなので適当なフォルダを作って、usbps3.exeを移動しておいてください。


ではスクリプトを開いてみます。usbps3.dspをダブルクリックで開きます。
スクリプトはVC++の古いバージョンで作られているようなので、

プロジェクト 'usbps3.dsp' は現在の Visual C++ プロジェクト形式に
変換されなければなりません。変換した後、このプロジェクトを旧バー
ジョンの Visual Studio で編集することはできません。

変換してこのプロジェクトを開きますか?

と表示されますので「はい」をクリック。

これで正常に開けたはずです。
「ファイル」→「すべてを保存」として、ファイルを開いたのと同じ場所にusbps3.slnを保存します。

次からの起動は、このソリューションファイル「usbps3.sln」をダブルクリックするか、VC++の「ファイル」→「開く」から選択することで開くことが出来ます。


ソリューションエクスプローラ 左側に、
ソリューションエクスプローラ
クラスビュー
プロパティマネージャ
というタブのついた枠があります。

ソリューションエクスプローラタブをクリックしてアクティブにします。

この上にツリーが出てくるのでこの中からusbps3.cppを探してダブルクリック。

出てきたこれが、メインのスクリプトです。

とりあえずビルド → 失敗

メニューから「ビルド」→「ソリューションのビルド」をクリック。

warningで'sprintf' の宣言を確認してください。がしこたま出てきます。ちなみにVC++2005EEEでも同じように出ます。

1>usbps3 - エラー 1、警告 27
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

今のVC++はセキュリティが強化され、sprintfは非推奨となりsprintf_sに置き換わりました。
これが原因のようです。

対策 その1

まずはsprintfの警告を取り除きます。

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

調べてみると、コンパイラのプリプロセッサオプションで _CRT_SECURE_NO_DEPRECATE マクロを定義すると警告を出さなくなるそうです。
意味はよく分かりませんが、とにかくやってみましょう。

  1. ソリューションエクスプローラタブのツリーからusbps3を右クリックしてプロパティを開きます。
    プロパティマネージャタブのusbps3をダブルクリックでもokです。
  2. 構成プロパティ -> C/C++ -> コマンドライン
    と言うふうに開きます。
  3. 追加のオプション」に次の1行を書き込む。
    /D "_CRT_SECURE_NO_DEPRECATE"
  4. メニューから「ビルド」→「ソリューションのリビルド
    警告が減りました。
    1>usbps3 - エラー 1、警告 0
    ========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========

一気に減りましたね。

対策 その2

残りは、

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


afxres.h が無いらしいです。afxres.hを作ることにします。

  1. ソリューションエクスプローラタブのツリーからHeader Filesを右クリック。
    追加 → 新しい項目
  2. ヘッダーファイル(.h)」を選択して、ファイル名に「afxres.h」と入力。
    追加をクリックします。
    Header Filesの下にafxres.hが作成されます。
  3. ツリーからafxres.hをダブルクリックするとファイルが開かれ、内容を編集できるようになります。
    まだ何も書いていないので真っ白な状態です。
  4. 次の2行を入力します。
    #include <windows.h>
    #define IDC_STATIC (-1)
  5. メニューから「ビルド」→「ソリューションのリビルド
    ビルドが成功しました。
    1>usbps3 - エラー 0、警告 0
    ========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========

これで対策完了。

今度こそのビルド

メニューから「デバッグ」 → 「デバッグ開始」をクリックするか、
usbps3___Win32_Debugフォルダのusbps3.exeをダブルクリックで作成した実行ファイルを起動することが出来ます。
ちゃんと動くか確認してみてください。


デバッグ版がうまくいったら、リリース版でビルドしてみます。


メニューから「ビルド」→「構成マネージャ」を開きます。
構成マネージャダイアログで左上にあるアクティブソリューション構成をReleaseにする。

このままビルドすると「sprintf」で警告が大量に出てくるので、マクロを定義しなおします。

  1. ソリューションエクスプローラタブのツリーからusbps3を右クリックしてプロパティを開きます。
    プロパティマネージャタブのusbps3をダブルクリックでもokです。
  2. 構成プロパティ -> C/C++ -> コマンドライン
    と言うふうに開きます。
  3. 追加のオプション」が空欄になっていると思うので、ここに次の1行を書き込む。
    /D "_CRT_SECURE_NO_DEPRECATE"
  4. メニューから「ビルド」→「ソリューションのリビルド
    警告が減りました。
    1>usbps3 - エラー 1、警告 0
    ========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========

まあ、さっきやったとおりです。

ビルドに成功したらReleaseフォルダを見てみます。
usbps3.exeが出来ているはずです。
デバッグ版のファイルと比べるとファイルサイズが明らかに違うのが確認できます。
ダブルクリックしてちゃんと実行できるか確認してみてください。

終わってしまった

書き上げてみたら結構簡単にビルドできましたね。
とはいえ、実際はここにたどり着くまであちこち調べまわりました。
幸いエラーの原因がVC++6.0とVC++2005以降との間での問題だったんで、該当記事も見つけることが出来ました。
VC++も新しくなって、古いスクリプトが簡単には動かないほどにいろいろ変わってきてるんですね。
ありがたいと言うべきか…面倒ですが。
と言うわけで今回の記事は、他のVC++6.0のソースを2005以降に移植するときにも使えそうですね。

さてこれで、サンプルを解析できるようになりました。
ところでソースを眺めてて思ったのですが、これってsixaxisdriverじゃなくてもsixaxisさえ認識できればちゃんと動きそうな気がするのですが 気のせいでしょうか。