【问题标题】:DirectInput8Create fails : E_INVALIDARGDirectInput8Create 失败:E_INVALIDARG
【发布时间】:2011-03-06 20:19:42
【问题描述】:

我将 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 中使用过直接输入,方式完全相同,没有任何问题。 我错过了什么?

谢谢。

【问题讨论】:

  • DIRECTINPUT_VERSION 在你之前设置 #include ?
  • @Peter Huene - DirectX SDK 包含一个用于 32 位和 64 位应用程序的 dinput8.lib
  • 在我删除评论后重新添加评论(因为这是一个没有经验的猜测),但没有看到 Petesh 已回复。解释原始评论:“我的猜测是没有 DX8 x64 实现。第一个 x64 DX 似乎是 2005 年对 9.0 的更新”。
  • @Petesh,是的,它是在包含 @Peter Huene 之前设置的,我使用的是 DX11 和 DI8,经过一些测试,它只是失败了,如果我使用 32 位或 64 位没有区别。

标签: c++ 64-bit directx-11 directinput


【解决方案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 替换该值时,我得到了与你看到的相同的错误。可能是 hI​​nstance 值没有正确初始化?

【讨论】:

  • 我也很茫然。我将 DI 初始化代码移到了我的 WinMain 函数中,做了一个非常简单的测试,但它失败了。我正在使用从 WinMain 传入的 hInstance。我只是不知道为什么。我使用 DX9 进行了多次 DI 加载,但从未遇到任何问题。似乎它甚至与 DX 版本没有任何关系,因为即使只是在 WinMain 中,创建也会失败。
  • 我不想建议,但您是否尝试过重新安装最新的 DirectX SDK,然后再试一次?这听起来像某些东西没有正确安装。我的简单尝试甚至没有 CoInitialize 并且它成功(根据文档)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    相关资源
    最近更新 更多