0

我将 DirectInput 与 Direct3D 11 一起使用,并为 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

好的,刚刚下载了最新的 DirectX SDK 和 Platform SDK,所以我可以在 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 位中都可以工作”。

当我使用 NULL 值而不是 outPtr 时出现无效指针错误,因此这似乎表明问题不是来自指针的无效值。

当我使用有效 hInstance 以外的任何东西时,我确实得到了一个无效参数 - 当我用 0 替换该值时,我得到了与您看到的相同的错误。也许 hInstance 值没有正确初始化?

于 2011-03-07T00:09:31.290 回答
1

好的,事实证明我正在使用 /SUBSYSTEM:CONSOLE 进行编译,并且在使用控制台子系统时从 WinMain 传入的 hInstance 根本不适合 DirectInput8Create。

于 2011-03-07T12:55:49.663 回答