SetCooperativeLevel

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
schneidi74
Beiträge: 15
Registriert: 29.03.2009, 17:20
Echter Name: Marco
Kontaktdaten:

SetCooperativeLevel

Beitrag von schneidi74 »

Hallo zusammen,

ich hab seit heute ein Phänomen was ich mir überhaupt nicht erklären kann.

Ich hab dieser Tage doch mal von Windows XP auf Vista gewechselt und hier die 64Bit Version von angeschafft. Soweit noch kein Problem.

Nun hab ich meinen Sourcecode compiliert, was auch einwandfrei funktioniert, bis auf den Punkt der Input Dinge abhandelt. Genau genommen scheitert dieser Funktionsaufruf:

Code: Alles auswählen

hr = _pKeyboard->SetCooperativeLevel( _hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
Wohlgemerkt hat das Anfang der Woche mit dem alten Windows XP alles einwandfrei funktioniert, und ich linke auch gegen die 32-Bit Libraries des DirectX SDK's.

Nun hab ich mir mal angesehen, was der denn an Fehlern rauswirft. Ziemlich simpel mit dem Aufruf hier:

Code: Alles auswählen

wchar_t strTest[1024];
swprintf( strTest, L"Description: %s\nErrorString: %s", DXGetErrorDescription9( hr ),
               DXGetErrorString9( hr ) );
MessageBoxW(0,strTest,L"TEST",MB_OK);
Das spannende ist das was mir die MessageBox rauswirft. Chinesische Schriftzeichen...
Bild

Kann mir das jemand erklären???

Danke schonmal im voraus!!!
Zuletzt geändert von schneidi74 am 08.06.2009, 09:25, insgesamt 1-mal geändert.
--=> Cre@tive-g@mes: www.creative-games.de <=-
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: SetCooperativeLevel und mein Programm spricht chinesich...

Beitrag von Krishty »

Hi,

Das sieht aus, als sei die Fehlermeldung ANSI-Text, du gibst deine Fehlermeldung aber in Wide-Chars aus. ::swprintf() kann die Parameter nicht identifizieren und übernimmt die Bytes einfach, auch wenn sie dann als komplett andere Wide-Characters interpretiert werden (unter XP hätte man Kästchen bekommen, Vista ist aber mit mächtigeren Schriftarten für exotische Zeichen ausgestattet).

Wie du DirectX dazu bewegst, Wide-Char-Meldungen auszugeben, kann ich dir an dieser Stelle aber nicht sagen. Steig auf ::MessageBoxA() um, wenn es nichts ausmacht.

Darum sollte man für sowas ::std::string und ::std::wstring verwenden ;)

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
schneidi74
Beiträge: 15
Registriert: 29.03.2009, 17:20
Echter Name: Marco
Kontaktdaten:

Re: SetCooperativeLevel und mein Programm spricht chinesich...

Beitrag von schneidi74 »

Ah ja natürlich, ich Schussel,

nichts desto trotz steh ich vor dem Problem, das es vorher funktioniert hat. Das einzige was mir noch aufgefallen ist, ich hab das neuste SDK draufgespielt (März 09).

Als Errorstring bekomme ich jetzt E_NOTIMPL
Als Description "The function called is not supported at this time"

Irgend eine Ahnung was das bedeuten könnte?
--=> Cre@tive-g@mes: www.creative-games.de <=-
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von kimmi »

Wahrscheinlich, daß die Funktion zu dem Zeitpunkt nicht zur verfügung steht. Such mal in der MSDN den Namen der Funktion + Fehlermeldung. Oft bieten die dann typische Lösungswege an, die dir helfen könnten, die Ursache des Fehlers zu verstehen.

Gruß Kimmi
schneidi74
Beiträge: 15
Registriert: 29.03.2009, 17:20
Echter Name: Marco
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von schneidi74 »

Das hab ich natürlich schon gemacht, wirklich aufschlussreich war's jedoch nicht.

Was mehr als spannend ist, ich hab das heute auf einem anderen PC (WinXP) mit identischem DirectX SDK installiert, compiliert und es lief...

Das macht mich mehr als verwundert. Kann das an dem 64-Bit Betriebssystem liegen?
--=> Cre@tive-g@mes: www.creative-games.de <=-
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von Krishty »

Laut Wikipedia (was sich, denke ich, hierauf bezieht) wurden Teile der DirectInput-Funktionalität nicht in Vista übernommen … ich finde keine Auflistung, welche genau das ist, aber zur Fehlermeldung passen würde es ja …

… nicht, dass ich Ahnung hätte (ich bin gleichzeitig mit Vista auf RawInput umgestiegen), aber funktionieren andere Parameter? Oder Admin-Rechte?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
schneidi74
Beiträge: 15
Registriert: 29.03.2009, 17:20
Echter Name: Marco
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von schneidi74 »

Andere Funktionen funktionieren, z.B. führe ich for dem SetCooperativeLevel

Code: Alles auswählen

if(FAILED( _pDevice->CreateDevice(GUID_SysKeyboard,
				   &_pKeyboard,
				   NULL ) ) )
		{
			return ADL_FAIL;
		}

		if(FAILED( _pKeyboard->SetDataFormat( &c_dfDIKeyboard ) ) )
		{
			return ADL_FAIL;
		}
aus, und das schlägt nicht fehl. Und die Benutzerkontensteuerung hab ich deaktiviert, also dürfte das auch nicht das Problem sein.

Muss ich mir wohl Gedanken um andere Möglichkeiten der Input-Erfassung machen...
--=> Cre@tive-g@mes: www.creative-games.de <=-
schneidi74
Beiträge: 15
Registriert: 29.03.2009, 17:20
Echter Name: Marco
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von schneidi74 »

Krishty hat geschrieben: … nicht, dass ich Ahnung hätte (ich bin gleichzeitig mit Vista auf RawInput umgestiegen), aber funktionieren andere Parameter? Oder Admin-Rechte?
Krishty hast du zufällig ein Tutorial wie ich an die RAW-Input Geschichte rangehen kann?
--=> Cre@tive-g@mes: www.creative-games.de <=-
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von Krishty »

schneidi74 hat geschrieben:Krishty hast du zufällig ein Tutorial wie ich an die RAW-Input Geschichte rangehen kann?
Nein, afaik ist die MSDN die einzige Anlaufstelle. Die Doku und die Samples dort sind zwar kurz, aber meist sehr informativ. Kritischer zu sehen ist, dass es kaum Support oder Anlaufstellen in Foren gibt (obwohl es die einzige Möglichkeit ist, z.B. mehrere Mäuse simultan zu verwenden).

Ich sehe hier aber nicht dass Problem, dass es nicht funktioniert, sondern eher, dass wir nicht wissen, warum … Ich würde vorher nochmal das letzte und vorletzte SDK testen, die Header darauf prüfen, dass auch alle Konstanten und Präprozessor-Direktiven korrekt gesetzt sind und eine Dummy-Anwendung bauen, in der sich der Fehler reproduzieren lässt. Sollte schneller gehen, als auf eine ganz neue API umzusteigen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
schneidi74
Beiträge: 15
Registriert: 29.03.2009, 17:20
Echter Name: Marco
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von schneidi74 »

Glaub mir, getestet hab ich schon ganz ordentlich.
Wie gesagt auf Windows XP läuft der gleiche Source mit gleichen Einstellungen auf gleichem SDK fehlerfrei.
Auf der gamedev.net Seite hab ich im Forum beim überfliegen einen ähnlichen Bericht gesehen, das Vista da im Bereich DirectX Input Probleme bereitet, und dort wurde auch die Verwendung von RAW-Input empfohlen.
--=> Cre@tive-g@mes: www.creative-games.de <=-
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von Krishty »

Okay. Ich habe vor zwei oder drei Jahren mal ein Raw-Input-Programm gebaut und hatte damals immer das Problem, dass eine Mausbewegung nach links als Mausbewegung nach links-unten erkannt wurde. Wenn du eh umsteigst, berichte doch mal, ob dir das auch passiert (fix ist trivial, würde nur gern wissen ob ich damals was verkehrt gemacht habe) :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von Helmut »

Hast du denn schon mal probiert das zu machen, was die meisten machen, nämlich den Fehler einfach zu ignorieren? Würde mich nicht wundern, wenn das Programm trotzdem funktioniert, weil die neueren Windowsversionen es eh ignorieren, wenn ein Programm den exklusiven Modus haben möchten.
Wahrscheinlich haben die MS Leute nur vergessen ein return 0 dahinzusetzen und du bist der Erste, der den Rückgabewert checkt:)

Ciao

ps: ich würde weder di noch rawinput verwenden. Die ganz normalen Messages reichen völlig aus.
schneidi74
Beiträge: 15
Registriert: 29.03.2009, 17:20
Echter Name: Marco
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von schneidi74 »

Helmut hat geschrieben:Hast du denn schon mal probiert das zu machen, was die meisten machen, nämlich den Fehler einfach zu ignorieren? Würde mich nicht wundern, wenn das Programm trotzdem funktioniert, weil die neueren Windowsversionen es eh ignorieren, wenn ein Programm den exklusiven Modus haben möchten.
Wahrscheinlich haben die MS Leute nur vergessen ein return 0 dahinzusetzen und du bist der Erste, der den Rückgabewert checkt:)
Das musste ich glatt ausprobieren, leider klappt's nicht.
Danach schlug er fehl bei

Code: Alles auswählen

_pKeyboard->Acquire()
Ignoriere ich beide Fehler passiert input-technisch leider überhaupt nichts... :|
--=> Cre@tive-g@mes: www.creative-games.de <=-
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von Helmut »

Dann versuch vielleicht mal DISCL_BACKGROUND wegzulassen (wieso setzt du das eigentlich?)
Könnte mir vorstellen, dass die das nicht eingebaut haben, um das Loggen von Tasteneingaben zu erschweren.

Ciao
schneidi74
Beiträge: 15
Registriert: 29.03.2009, 17:20
Echter Name: Marco
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von schneidi74 »

Nix zu machen, das Ding ziert sich... :evil:
Ich glaub ich mach jetzt alles mit SDL, dann hat die liebe Seele Ruhe...
--=> Cre@tive-g@mes: www.creative-games.de <=-
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: SetCooperativeLevel

Beitrag von kimmi »

Vielleicht kannst du in der SDL-Implementierung ja mal nachschauen, wie die das lösen. Schließlich standen die vor der gleichen Hürde.

Gruß Kimmi
Antworten