DirectInput8Create失败:E_INVALIDARG

时间:2011-03-06 20:19:43

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

我正在使用Direct3和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的直接输入,以完全相同的方式并没有任何问题。 我错过了什么?

感谢。

2 个答案:

答案 0 :(得分:1)

好的,事实证明我正在使用/ SUBSYSTEM:CONSOLE进行编译,并且在使用控制台子系统时从WinMain传入的hInstance不会让DirectInput8Create完全没有。

答案 1 :(得分:0)

好的,刚刚下载了最新的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值未正确初始化?