首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectInput8Create失败: E_INVALIDARG

DirectInput8Create失败: E_INVALIDARG
EN

Stack Overflow用户
提问于 2011-03-07 04:19:43
回答 2查看 1.9K关注 0票数 0

我在Direct3D 11上使用DirectInput,并为x64编译,我从下面这一行得到了一个E_INVALIDARG:

代码语言:javascript
复制
HRESULT hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, reinterpret_cast<void **>(&this->_d8Input), 0);

当我设置一个断点来查看所发生的事情时,我没有得到任何无效参数的迹象。我的hInstance是有效的,_d8Input指针也是有效的,并且DIRECTINPUT_VERSION设置为0x0800。

我以前在D3D9中使用过直接输入,以完全相同的方式,没有任何问题。我错过了什么?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-07 20:55:50

好吧,事实证明我是用/SUBSYSTEM:CONSOLE编译的,当使用控制台子系统时,从WinMain传入的hInstance根本不会让DirectInput8Create满意。

票数 1
EN

Stack Overflow用户

发布于 2011-03-07 08:09:31

好了,我刚刚下载了最新的DirectX软件开发工具包和平台软件开发工具包,这样我就可以在64位上测试它了,我创建了一个极其简单的64位应用程序。对于我添加的stdafx.h文件:

代码语言:javascript
复制
#define DIRECTINPUT_VERSION 0x0800
#include <Dinput.h>

在_tWinMain函数中,我添加了:

代码语言:javascript
复制
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时,我得到了一个无效的指针错误,所以这似乎表明问题不是来自指针的无效值。

当我使用有效hInstance以外的任何值时,我确实得到了一个无效参数-当我将值替换为0时,我得到了与您看到的相同的错误。可能hInstance值未正确初始化?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5213107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档