質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

940閲覧

IDirectInput8インターフェースの取得方法

Tatsuk

総合スコア11

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2019/11/16 14:51

編集2019/11/17 02:23

前提・実現したいこと

環境:64bit版windows10,VC++2019,DirectX SDK(2010)を利用
最終的にDirectInputでコマンドプロント上にジョイスティックのデータを表示しながら、ボタンを押すことでフォースフィードバックを行うプログラムを作ることを目標に設定。
まずDirectInputの練習もかねて、1秒ごとにコマンドプロント上にジョイスティックの情報の表示を行いたいと考えていました。

発生している問題・エラーメッセージ

DirectX9実践プログラミングという本を参考に以下の様なコードを書いてみましたが、最初のインターフェースの取得の時点で ”オブジェクトの作成に失敗” と表示され、IDirectInput8インターフェースの取得すらできていない状態です。まだプログラミングについての知識が浅く、書き方に問題があるせいだと思うのですが、DirectInput関連の本を読んでも原因がよく分からなった為質問させて頂きました。 またその他書き方として不味い点などがあれば教えていただけると幸いです。

該当のソースコード

c++

1 2#include <iostream> 3 4#define STRICT 5#define DIRECTINPUT_VERSION 0x0800 6 7#include <windows.h> 8#include <crtdbg.h> 9 10#pragma warning( disable : 4996 ) // 警告を一時的に無効にする 11#include <strsafe.h> 12#pragma warning( default : 4996 ) 13 14#include <dinput.h> 15#include <dxerr.h> 16 17 18#define SAFE_RELEASE(x) {if(x){(x)->Release();x=NULL;}} 19 20// 必要なライブラリをリンクする 21#pragma comment( lib, "dinput8.lib" ) 22#pragma comment( lib, "dxerr.lib" ) 23#pragma comment( lib, "dxguid.lib" ) 24 25 26HWND hWlg; 27HINSTANCE hInstApp; // インスタンス・ハンドル 28 29// DirectInputの変数 30LPDIRECTINPUT8 g_pDInput = NULL; // DirectInput 31LPDIRECTINPUTDEVICE8 g_pDIDevice = NULL; // DirectInputデバイス 32LPDIRECTINPUTEFFECT g_pDIEffect = NULL; // エフェクト 33DIDEVCAPS g_diDevCaps; // ジョイスティックの能力 34#define DIDEVICE_BUFFERSIZE 100 // デバイスに設定するバッファ・サイズ 35 36 37BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext); 38BOOL CALLBACK EnumAxesCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef); 39 40int main() 41{ DIJOYSTATE2 dijs; 42 HWND hWlg = GetConsoleWindow(); 43 HRESULT hr; 44 45 // IDirectInput8の作成 46 hr = DirectInput8Create(hInstApp, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDInput, NULL); 47 // 48 if (FAILED(hr)) 49 { 50 printf("オブジェクト作成に失敗\n"); 51 return -1; 52 } 53 54 // ジョイスティックの列挙 55 hr = g_pDInput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, NULL, 56 DIEDFL_FORCEFEEDBACK | DIEDFL_ATTACHEDONLY); 57 if (FAILED(hr) || g_pDIDevice == NULL) { 58 printf("デバイスオブジェクト作成に失敗\n"); 59 g_pDInput->Release(); 60 return -1; 61 } 62 //データ設定およびモードを設定(フォアグラウンド&排他モード) 63 g_pDIDevice->SetDataFormat(&c_dfDIJoystick2); 64 g_pDIDevice->SetCooperativeLevel(hWlg, DISCL_EXCLUSIVE | DISCL_FOREGROUND); 65 66 67 // 軸モードを設定 68 DIPROPDWORD diprop; 69 diprop.diph.dwSize = sizeof(diprop); 70 diprop.diph.dwHeaderSize = sizeof(diprop.diph); 71 diprop.diph.dwObj = 0; 72 diprop.diph.dwHow = DIPH_DEVICE; 73 diprop.dwData = DIPROPAXISMODE_ABS; 74 hr = g_pDIDevice->SetProperty(DIPROP_AXISMODE, &diprop.diph); 75 if (FAILED(hr)) 76 { 77 printf("軸モードの設定に失敗"); 78 return -1; 79 } 80 //コールバック関数を使って各軸のモードを設定 81 hr = g_pDIDevice->EnumObjects(EnumAxesCallback, NULL, DIDFT_AXIS); 82 if (FAILED(hr)) 83 { 84 printf("軸モードの設定に失敗"); 85 return -1; 86 } 87 88 // バッファリング・データを取得するため、バッファ・サイズを設定 89 diprop.dwData = DIDEVICE_BUFFERSIZE; 90 hr = g_pDIDevice->SetProperty(DIPROP_BUFFERSIZE, &diprop.diph); 91 if (FAILED(hr)) 92 { 93 printf("バッファ・サイズの設定に失敗"); 94 return -1; 95 } 96 97 hr = g_pDIDevice->Poll(); 98 hr = g_pDIDevice->Acquire(); 99 int i; 100 101 for (i = 0; i <= 10; i++) 102 { 103 hr = g_pDIDevice->GetDeviceState(sizeof(DIJOYSTATE2), &dijs); 104 printf("X = % d Y = % d Z = % d][Rx = % d Ry = % d Rz = % d Slider1 = % d Slider2 = % d\n", 105 dijs.lX, dijs.lY, dijs.lZ, 106 dijs.lRx, dijs.lRy, dijs.lRz, 107 dijs.rglSlider[0], dijs.rglSlider[1]); 108    Sleep(1000); 109 } 110 111 g_pDIDevice->Unacquire(); 112 if (g_pDIDevice != NULL)g_pDIDevice->Release(); 113 if (g_pDInput != NULL)g_pDInput->Release(); 114 115 printf("正常終了\n"); 116 return 0; 117 118} 119 120BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext) 121{ 122 HRESULT hr; 123 124 // 列挙されたジョイスティックへのインターフェイスを取得する。 125 hr = g_pDInput->CreateDevice(pdidInstance->guidInstance, &g_pDIDevice, NULL); 126 if (FAILED(hr))return DIENUM_CONTINUE; 127 128 // ジョイスティックの能力を調べる 129 g_diDevCaps.dwSize = sizeof(DIDEVCAPS); 130 hr = g_pDIDevice->GetCapabilities(&g_diDevCaps); 131 if (FAILED(hr)) 132 { 133 // ジョイスティック能力の取得に失敗 134 SAFE_RELEASE(g_pDIDevice); 135 return DIENUM_CONTINUE; 136 } 137 138 return DIENUM_STOP; // 1つ見付けたら列挙を止める 139} 140 141// ジョイスティックの軸を列挙する関数 142BOOL CALLBACK EnumAxesCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) 143{ 144 HRESULT hr; 145 146 // 軸の値の範囲を設定(-1000~1000) 147 DIPROPRANGE diprg; 148 ZeroMemory(&diprg, sizeof(diprg)); 149 diprg.diph.dwSize = sizeof(diprg); 150 diprg.diph.dwHeaderSize = sizeof(diprg.diph); 151 diprg.diph.dwObj = lpddoi->dwType; 152 diprg.diph.dwHow = DIPH_BYID; 153 diprg.lMin = -1000; 154 diprg.lMax = +1000; 155 hr = g_pDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph); 156 if (FAILED(hr)) 157 return DIENUM_STOP; 158 159 return DIENUM_CONTINUE; 160} 161

試したこと

補足情報(FW/ツールのバージョンなど)

参考にしたもの
http://www.kohgakusha.co.jp/support/sdx9xpv7/index.html
のサンプルプログラム4

利用したジョイスティック
Cyborg Evo Force Joystick

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

インスタンスハンドルの初期化を忘れていました
HINSTANCE hInstApp = GetModuleHandle(NULL);
でオブジェクトは無事生成できました。

投稿2019/11/17 12:11

Tatsuk

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問