.[ ČeskéHry.cz ].
Nastavení Directinput pod Delphi (bez DelphiX)

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Delphi / Pascal
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
hanykom



Založen: 07. 12. 2009
Příspěvky: 4

PříspěvekZaslal: 7. prosinec 2009, 15:34:16    Předmět: Nastavení Directinput pod Delphi (bez DelphiX) Odpovědět s citátem

Ahoj,

pokouším se nahodit DirectInput v Delphi. Mám k tomu nějaké unity odtud http://clootie.narod.ru/delphi , které autor zřejmě přepsal z c++. Například direct3D nahodit jde, ale s DirectInput mám problém. Pokoušel jsem se ho zprovoznit podle tutoriálů na msdn.microsoft.com a podle hledání různě po internetu, ale bohužel bez úspěchu. Problém je asi hned ve funkci DirectInputCreate. Podle msdn i podle samotného zdrojového kódu unity DirectInput jako třetí parametr tato funkce vyžaduje ukazatel na instanci DirectInputu, která se tou funkcí má zinicializovat. Bohužel ale když tam zapíšu ukazatel na proměnnou té instance, tak k mému úžasu delphi protestují, že musí být stejný typ skutečných a dormálních parametrů (jakoby asi nebyl?) a když do toho parametru zapíšu přímo proměnnou té instance, tak jsou delphi již spokojeny, ale až program spustím, tak mi hned zhasne, protože se Directinput stejně neinicializuje. Prosím věděl by někdo jak to dát dohromady? Prosím, prosím.

Tady je ten můj kód:

kód:

  g_lpDirectInput: IDirectInput; //mozna sem patri jako typ neco jineho
  g_plpDirectInput: ^IDirectInput;
  g_lpDIDevice: IDirectInputDevice; //tady mozna taky


function InitDirectInput(l_hinst:Cardinal;hWnd:HWND): HRESULT;
begin
  Result:= E_FAIL;

//s tim ukazatelem to stejne taky nefunguje
  g_plpDirectInput:=@g_lpDirectInput;

  //vytvoreni instance DirectInput
{ Result:=DirectInput8Create(l_hinst, DIRECTINPUT_VERSION,
        IID_IDirectInput8, g_plpDirectInput, nil);}
  Result:=DirectInputCreate(l_hinst, DIRECTINPUT_VERSION,
                   g_lpDirectInput, nil);

  if FAILED(Result)then
  begin
    Result:= E_FAIL;
    Exit;
  end;

  //vytvoreni DirectInput zarizeni - Klavesnice
  Result := g_lpDirectInput.CreateDevice(GUID_SysKeyboard, g_lpDIDevice, nil);
  if FAILED(Result)then
  begin
    Result:= E_FAIL;
    Exit;
  end;

  //nastaveni datoveho formatu klavesnice
  Result := g_lpDIDevice.SetDataFormat(c_dfDIKeyboard);

  if FAILED(Result)then
  begin
    Result:= E_FAIL;
    Exit;
  end;

  //nastaveni chovani klavesnice
  Result := g_lpDIDevice.SetCooperativeLevel(hWnd,
                            DISCL_FOREGROUND or DISCL_NONEXCLUSIVE);
  if FAILED(Result)then
  begin
    Result:= E_FAIL;
    Exit;
  end;

  //ziskani pristupu k zarizeni
  Result := g_lpDIDevice.Acquire();
  if FAILED(Result)then
  begin
    Result:= E_FAIL;
    Exit;
  end;

  Result:=S_OK;
end;


To rezna: sice nevím, co jsi tím myslel, ale stačí?
_________________
Nefunguje to Smile


Naposledy upravil hanykom dne 7. prosinec 2009, 18:44:08, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2150

PříspěvekZaslal: 7. prosinec 2009, 15:41:59    Předmět: Odpovědět s citátem

MODERATOR: pouzij tag CODE - neda se ten kod cist
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
posila



Založen: 29. 07. 2007
Příspěvky: 201

PříspěvekZaslal: 7. prosinec 2009, 22:40:14    Předmět: Odpovědět s citátem

Tady (http://nopaste.ceske-hry.cz/222793) je vytazek z frameworku, ktery jsem se pred lety snazil napsat. DirectInput mi tam fungoval...

Na prvni pohled je tam rozdil v pouzitem interfacu. Ja jsem pouzival IDirectInput8. Takze to vyzkousej takto:

kód:

g_lpDirectInput: IDirectInput8;
{...}

function InitDirectInput(l_hinst:Cardinal;hWnd:HWND): HRESULT;
begin
  {...}
  Result := DirectInput8Create(l_hinst, DIRECTINPUT_VERSION, IID_IDirectInput8, g_lpDirectInput, nil);
  {...}
  Result := g_lpDIDevice.SetDataFormat(@c_dfDIKeyboard);
  {...}
end;


EDIT: Mozna ti to nefunguje jen kvuli tomu g_lpDIDevice.SetDataFormat( c_dfDIKeyboard ). Nikde jsem to nevidel predavat primo tu hodnotu, ale vzdy jen jeji adresu.

EDIT2:
hanykom napsal:
Podle msdn i podle samotného zdrojového kódu unity DirectInput jako třetí parametr tato funkce vyžaduje ukazatel na instanci DirectInputu, která se tou funkcí má zinicializovat.
kód:
DirectInputCreate   : function (hinst : THandle; dwVersion : Cardinal; out ppDI : IDirectInput; punkOuter: IUnknown) : HResult;

To klicove slovo out znamena, ze se parametr predava odkazem (stejne jako u var), ale nemusi byt pred volanim funkce inicializovany. Takze predavat tomu pointer opravdu typove nesedi.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
hanykom



Založen: 07. 12. 2009
Příspěvky: 4

PříspěvekZaslal: 8. prosinec 2009, 10:31:02    Předmět: Odpovědět s citátem

Dík za radu. S tím DI device 8 už se to inicializuje (asi), ale pak když vypínám program, tak mi tam naskočí chybová hláška s nějakou hexadecimální adresou (která je mi na...) a klávesy mi to stejně nebere. Mimochodem mi nejde zapsat do SetDataFormat ukazatel
kód:
 @c_dfDIKeyboard
, ale jen přímo proměnná(konstanta?) a když jsem se pokusil přepsat hlavičku tý funkce, tak se to nezkompilovalo. No jinak ano, v DirectInputCreate je skutečně vyžadován typ IDirectInput, ale v DirectInput8Create je ten ukazatel:
kód:
function DirectInput8Create(hinst: THandle; dwVersion: DWORD; const riidltf: TGUID; out ppvOut{: Pointer}; punkOuter: IUnknown): HResult; stdcall; external DirectInput8Dll;

_________________
Nefunguje to Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Delphi / Pascal Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna