0

Direct3D 11でDirectInputを使用しており、x64用にコンパイルすると、次の行からE_INVALIDARGが取得されます。

HRESULT hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, reinterpret_cast<void **>(&this->_d8Input), 0);

何が起こっているのかを見るためにブレークポイントを設定すると、無効な引数の兆候は見られません。私のhInstanceは有効であり、_d8Inputポインターも有効であり、DIRECTINPUT_VERSIONは0x0800に設定されています。

以前、D3D9で直接入力を使用したことがありますが、まったく同じ方法で問題はありませんでした。私は何が欠けていますか?

ありがとう。

4

2 に答える 2

1

さて、最新のDirectXSDKとPlatformSDKをダウンロードしたばかりなので、これを64ビットでテストできるので、めちゃくちゃシンプルな64ビットアプリケーションを作成しました。私が追加したstdafx.hファイルの場合:

#define DIRECTINPUT_VERSION 0x0800
#include <Dinput.h>

_tWinMain関数に次を追加しました。

void *outPtr = NULL;
HRESULT aResult = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, &outPtr, NULL);

if (aResult != DI_OK) {
    LPCWSTR emesg = L"??";
    switch (aResult) {
    case DIERR_BETADIRECTINPUTVERSION: emesg = L"Beta Directinput version"; break;
    case DIERR_INVALIDPARAM: emesg = L"Invalid Parameter"; break;
    case DIERR_OLDDIRECTINPUTVERSION: emesg = L"Old Directinput Version"; break;
    case DIERR_OUTOFMEMORY: emesg = L"Out of Memory"; break;
    }
    MessageBox(GetDesktopWindow(), emesg, emesg, 0);
}

リンカーオプションについては、dinput8.libとdxguid.libを追加しました

コンパイルされ、アプリケーションが64ビットであることを確認し、無効なパラメータメッセージを生成することなく正常に実行されます。outPtr変数で有効な値を取得します。dinput.hファイルの内容も調べました。これは、DIRECTINPUT_VERSIONがデフォルトで0x0800に設定されていることを示しているようです。

私は途方に暮れています、これは32ビットと64ビットの両方で「うまくいくはずです」。

outPtrの代わりにNULL値を使用すると、無効なポインターエラーが発生します。これは、問題がポインターからの無効な値ではないことを示しているようです。

有効なhInstance以外のものを使用すると、無効なパラメーターが取得されます。値を0に置き換えると、同じエラーが発生します。おそらく、hInstance値が正しく初期化されていませんか?

于 2011-03-07T00:09:31.290 に答える
1

わかりました。/SUBSYSTEM:CONSOLEを使用してコンパイルしていたことがわかりました。コンソールサブシステムを使用しているときに、WinMainから渡されたhInstanceは、DirectInput8Createをまったく使用しません。

于 2011-03-07T12:55:49.663 に答える