More WinAPI Stuff

Miscellaneous 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!