User Defined types By Ref ?
BlitzMax Forums/BlitzMax Beginners Area/User Defined types By Ref ?| 
 | ||
| I am trying to get info returned by a windows API function.  Is it possible to use VAR with user defined types? With the code below, some garbarge info is returned then it crashes. 
Type MIDIOUTCAPS 
	Field wMid:Short
	Field wPid:Short
	Field vDriverVersion:Int' MMVERSION 
	Field szPname:Byte[32] 'String[MAXPNAMELEN]
	Field wTechnology:Short
	Field wVoices:Short
	Field wNotes:Short
	Field wChannelMask:Short
	Field dwSupport:Int
EndType
Extern "Os"
  Function midiOutGetNumDevs()
  Function midiOutGetDevCapsA( uDeviceID:Int, lpCaps:MIDIOUTCAPS Var, uSize:Int) ' Var = By Ref
End Extern
Local MaxOutDev =  midiOutGetNumDevs()
Print "MaxOutDev = "+MaxOutDev 
Local InfoOut:MidiOutCaps
For count = -1 To MaxOutDev
  Print "DEVICE : "+count
  midiOutGetDevCapsA(count,InfoOut:MidiOutCaps, 52)
  If (InfoOut<> Null) Then
    Print "wMid "+Int(InfoOut.wMid)
    Print "wPid "+Int(InfoOut.wPid)
    Print "vDriverVersion "+InfoOut.vDriverVersion
   'Print "szPname"
    Print "wTechnology " + InfoOut.wTechnology
    Print "wVoices " + InfoOut.wVoices
    Print "wNotes "+ InfoOut.wNotes
    Print "wChannelMask " + InfoOut.wChannelMask
    Print "dwSupport " + InfoOut.dwSupport
  EndIf
Next
Any help would be most welcome. | 
| 
 | ||
| You can try using Ptr rather than Var and then doing a Varptr on the params.  I had a rather big structure with arrays etc, didnt work for me to get the structure. In your case it looks like you'll have to write a C wrapper (compiled into a module). In mine, you could grab a pointer to the structure in the dll's memory and then read the structure with pointers. | 
| 
 | ||
| Hi, The szPname field will not work, as it's a Blitz array, not a static 'C' array. Currently, the only way around this is the extremely elegant... Field szPname_0,szPname_1,szPname_2,szPname_3 Field szPname_4,szPname_5,szPname_6,szPname_7 ...which will pad the 'struct' with a 32 byte 'char array'. Use Varptr szPname_0 to get the address of the 'array', eg: Print String.FromCString( Varptr infoOut.szPname_0 ) | 
| 
 | ||
| Thanks Bot Builder and Mark for the very usefull Info. Mark I had wondered how to get a fixed length char string. If I use pointers how do I get the info back into my user type? And Thankyou for a great Christmas!! | 
| 
 | ||
| A question: For count = -1 To MaxOutDev Why does count start from -1 ? Shouldn't start from 0 ? Sergio. | 
| 
 | ||
| No. Out devices do start at -1 for some reason. Working code to look at all Midi Output devices. | 
| 
 | ||
| @Ziltch, thank you - really appreciated. Sergio. |