Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
hanykom
Založen: 07. 12. 2009 Příspěvky: 4
|
Zaslal: 7. prosinec 2009, 15:34:16 Předmět: Nastavení Directinput pod Delphi (bez DelphiX) |
|
|
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
Naposledy upravil hanykom dne 7. prosinec 2009, 18:44:08, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 7. prosinec 2009, 15:41:59 Předmět: |
|
|
MODERATOR: pouzij tag CODE - neda se ten kod cist |
|
Návrat nahoru |
|
|
posila
Založen: 29. 07. 2007 Příspěvky: 201
|
Zaslal: 7. prosinec 2009, 22:40:14 Předmět: |
|
|
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 |
|
|
hanykom
Založen: 07. 12. 2009 Příspěvky: 4
|
Zaslal: 8. prosinec 2009, 10:31:02 Předmět: |
|
|
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
, 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 |
|
Návrat nahoru |
|
|
|