[C++/DirectInput] SetCooperativeLevel wil niet lukken in DLL

Pagina: 1
Acties:

Vraag


  • ikt
  • Registratie: Juli 2008
  • Laatst online: 10-10 22:16
Hoi Tweakers,

Ik ben radeloos en blijkbaar werkt het voor iedereen 100% de eerste keer want ik kan letterlijk niks vinden hierover. Ik probeer tegen mijn stuurtje te praten met DirectInput, dit gehannes gebeurt in een .dll die door wat magie (ScriptHookV) door GTA V wordt geladen. Alles wel en kommer, ik kan prima het ding pollen en aflezen. Komen we bij het Force Feedback gedeelte.

Per Microsoft's voorbeeld: (FFJoy project)
code:
1
    // Exclusive access is required in order to perform force feedback.


Ik doe het volgende op het gevonden apparaatje via het DirectInput object:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ergens heulemaal bovenaan:
#define FAILED(hr) (((HRESULT)(hr)) < 0)
// per winerror.h


            HRESULT hr;
            if (FAILED( hr = e->diDevice->SetCooperativeLevel(
                    GetForegroundWindow(),
                    DISCL_EXCLUSIVE | DISCL_FOREGROUND))) {
                std::stringstream ss;
                ss << std::hex << hr;
                logger.Write("Error " + ss.str());
                return false;
            }


En ja hoor, het ding geeft geen S_OK of iets dergelijks terug. Mijn logje zegt dit:

code:
1
[21:32:11.124] Error 800700aa

Dit komt dus niet voor in winerror.h.

Hier wordt de DirectX SDK van juni 2010 gebruikt, voor XInput en DirectInput, winerror.h is dus ook daarvan.

Ik heb nog uit radeloosheid gewoon "nullptr" neergeplempt waar GetForegroundWindow() staat, maar ik krijg dezelfde error terug. Alles wat ik op Google vind hierover is "Resource is in use", maar dat is enkel bij .NET applicaties. Zelf denk ik dat dit aan GetForegroundWindow() kan liggen - dat deze niet goed het window met GTA V op geeft. De waarde is in ieder geval geen 0.

Buiten dit werkt het als een zonnetje, enkel de initialisatie van het nodige gebeuren voor DInput FF gaat fout. Als je mijn loodgieter-gehacksel wilt bekijken -
https://github.com/E66666666/GTAVManualTransmission

De klasse die hierover gaat is WheelDirectInput, InitWheel is de method die dit gebeuren initialiseert. Source code zit in Gears - als je het bouwen uit wilt proberen - je hebt de dingen nodig die in de links staan + je moet de natives.h even updaten/aanpassen.

Beste antwoord (via ikt op 15-09-2016 00:09)


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14:49
Zoek eerst eens uit welke error code je krijgt dan, volgens de docs die ik kan vinden kan 'ie alleen maar DI_OK, DIERR_INVALIDPARAM, DIERR_NOTINITIALIZED, E_HANDLE doen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14:49
Zoek eerst eens uit welke error code je krijgt dan, volgens de docs die ik kan vinden kan 'ie alleen maar DI_OK, DIERR_INVALIDPARAM, DIERR_NOTINITIALIZED, E_HANDLE doen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • ikt
  • Registratie: Juli 2008
  • Laatst online: 10-10 22:16
farlane schreef op woensdag 14 september 2016 @ 23:18:
Zoek eerst eens uit welke error code je krijgt dan, volgens de docs die ik kan vinden kan 'ie alleen maar DI_OK, DIERR_INVALIDPARAM, DIERR_NOTINITIALIZED, E_HANDLE doen.
Hmm, weer niet beet. Dit is wel apart zeg.
Dit prop ik er tussen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
std::string hrStr;
                switch (hr) {
                    case DI_OK:
                        hrStr = "DI_OK";
                        break;
                    case DIERR_INVALIDPARAM:
                        hrStr = "DIERR_INVALIDPARAM";
                        break;
                    case DIERR_NOTINITIALIZED:
                        hrStr = "DIERR_NOTINITIALIZED";
                        break;
                    case E_HANDLE:
                        hrStr = "E_HANDLE";
                        break;
                    default:
                        hrStr = "UNKNOWN";
                        break;
                }
                logger.Write("HRESULT = " + hrStr);
                std::stringstream ss;
                ss << std::hex << hr;
                logger.Write("Error: " + ss.str());


Ik krijg terug:
code:
1
2
[23:40:28.081] HRESULT = UNKNOWN
[23:40:28.081] Error: 800700aa


Tenzij ik totaal vergeten ben hoe een switch case werkt, geeft het toch een heel andere foutmelding terug dan wat er verwacht mag worden. Ik heb ondertussen ook de define vervangen door een include van winerror.h, maar het wordt er niet duidelijker op.

Edit - Gevonden!
[00:08:18.576] HRESULT = DIERR_ACQUIRED

Geen vast nummer dus. Een roepje naar Unacquire(); voordat SetCooperativeLevel(); wordt aangeroepen lost alles op. Dank!

[ Voor 11% gewijzigd door ikt op 15-09-2016 00:21 ]