More WinAPI Stuff
Archives Forums/Win32 Discussion/More WinAPI Stuff
| ||
]I figured this was perhaps the best place for this as ythe discussion had moved on... Okay.,.. I am not good at this. I have managed to obtain the following info on joyGetDevCaps() from MSDN, joyGetDevCaps( UINT_PTR uJoyID, LPJOYCAPS pjc, UINT cbjc ); typedef struct { WORD wMid; WORD wPid; TCHAR szPname[MAXPNAMELEN]; UINT wXmin; UINT wXmax; UINT wYmin; UINT wYmax; UINT wZmin; UINT wZmax; UINT wNumButtons; UINT wPeriodMin; UINT wPeriodMax; UINT wRmin; UINT wRmax; UINT wUmin; UINT wUmax; UINT wVmin; UINT wVmax; UINT wCaps; UINT wMaxAxes; UINT wNumAxes; UINT wMaxButtons; TCHAR szRegKey[MAXPNAMELEN]; TCHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME]; } JOYCAPS; I understand a 'Structure' to be equivalent in C to a Blitz 'Custom Type', however, I am not sure how to actually extract the 'fields'. I've gotten only so far with the Decls: .lib "WinAPI.dll" GetController(uJoyID,pjc,cbjc):"joyGetDevCaps" (Which I'm totally proud of the fact the function shows up in the Blitz IDE, tregardless of it working or not!!!) To test this, I made the extremely simple bb code: Print GetController(0,0,0) Which results in an "Illegal Type Conversion". I'm guessing it's because I need some form of syntax to point to the fields I want, not just leave the parameters as they are, but I have no clue how to go about this. Apologies for my complete ignorance, but any pointers would be really helpful! |
| ||
Surely someone has made decls files for functions that are based on Structs before? Please, any suggestions would be helpful, I'm at a total loss myself. |
| ||
Well, it has been a while since I did this type of stuff, but I think for the pointer type parameters, you could create a bank:uJoyID = createbank(1) cbjc = size of JOYCAPS structure above pjc = createbank( cbjc ) Print GetController(uJoyID, pjc, cbjc) It could be possible to use a Type as well, but I never did that, so I don't know. You can find the size of JOYCAPS by adding up the bytes of each field. Word/UInt=2 byte (or maybe UINT=4 bytes, well try it and if it doesn't work, then Google it). And I think that the TCHARS should be 16 bytes in length, because a quick Google search gave me MAXPNAMELEN=16. What is important, is that the bank size isn't too small. If it is too big, it is a waste of memory, but not a reason for errors. So, as a test, you might as well make it a very large bank. Then, if it works, you can calculate the length more precise. Then, in your declaration, you should add an asterix after the pointer type parameters. I can valguely remember that at some point it didn't work anymore, but it should be something along the lines of this: .lib "WinAPI.dll" GetController(uJoyID*, pjc*, cbjc):"joyGetDevCaps" After calling GetController, and no error is showing up, you can read the bank, using PeekShort (for Words) PeekInt(for integers) If there is a string, then you should read it byte-by-byte until you find a zero. That is a null-terminated string. Each byte is an ascii code. repeat c = PeekByte(bank, i) if c = 0 then exit write chr$(c) i = i + 1 forever Instead, as a test, you can read all the bytes in the bank and print them out. If there is a joystick name in there, you should be able to see it: for i = 0 to banksize - 1 if i mod 30 = 0 then print c = peekbyte(bank, i) write chr$(c) next Hopefully this helps, good luck! |