Isaiah - Thank you so much. I was able to work around the array issue in Julia 3.9 by declaring an immutable type with one field for each character. Kind of an ugly solution, but szPname is limited to 32 characters, so it's not a big deal. I think it would be more elegant to use a large bitstype to represent the array, but I was unable to figure out how to reinterpret it to a string.
On Sunday, 6 September 2015 17:37:01 UTC-4, Joel Hobson wrote: > > Hi all, > > I'm trying to use some C functions, but I'm running into trouble using the > results. > > This is the function I'm trying to call: > https://msdn.microsoft.com/en-us/library/dd798469(v=vs.85).aspx > And this is the struct that it's expecting a pointer to: > https://msdn.microsoft.com/en-us/library/dd798467(v=vs.85).aspx > > Here's my struct definition in Julia: > > type MidiOutCaps > wMid::Uint16 > wPid::Uint16 > vDriverVersion::Uint32 > szPname::Ptr{Uint8} > wTechnology::Uint16 > wVoices::Uint16 > wNotes::Uint16 > wChannelMask::Uint16 > dwSupport::Uint32 > > MidiOutCaps() = new(0, 0, 0, Array(Uint8, 32), 0, 0, 0, 0, 0) > end > > And the function for loading it: > > function getoutputdeviceswindows() > numberofdevices = ccall( (:midiOutGetNumDevs, :Winmm), Int32, ()) > > for i in [0:numberofdevices-1] > output_struct = MidiOutCaps() > > err = ccall( (:midiOutGetDevCapsA, :Winmm), Uint32, (Ptr{Uint32}, > Ptr{MidiOutCaps}, Uint32), i, &output_struct, sizeof(output_struct)) > > println("Err is $(err)") > println("Result is $(output_struct)") > > println("Result name is $(unsafe_load(output_struct.szPname, 0))") > end > end > > Both ccalls execute without error, and it appears to populate the struct > correctly, but when I try to do an unsafe load on the szPname, Julia > crashes and I get this: > > Please submit a bug report with steps to reproduce this fault, and any > error messages that follow (in their entirety). Thanks. > Exception: EXCEPTION_ACCESS_VIOLATION at 0xdbc6d34 -- unsafe_load at > pointer.jl:45 > unsafe_load at pointer.jl:45 > jlcall_unsafe_load_1323 at (unknown line) > jl_apply_generic at > C:\Users\Joel\AppData\Local\Julia-0.3.9\bin\libjulia.dll (unknown line) > jl_interpret_toplevel_expr at > C:\Users\Joel\AppData\Local\Julia-0.3.9\bin\libjulia.dll (unknown line) > jl_interpret_toplevel_thunk_with at > C:\Users\Joel\AppData\Local\Julia-0.3.9\bin\libjulia.dll (unknown line) > jl_eval_with_compiler_p at > C:\Users\Joel\AppData\Local\Julia-0.3.9\bin\libjulia.dll (unknown line) > jl_f_top_eval at C:\Users\Joel\AppData\Local\Julia-0.3.9\bin\libjulia.dll > (unknown line) > eval_user_input at REPL.jl:53 > jlcall_eval_user_input_1054 at (unknown line) > jl_apply_generic at > C:\Users\Joel\AppData\Local\Julia-0.3.9\bin\libjulia.dll (unknown line) > anonymous at task.jl:95 > jl_handle_stack_switch at > C:\Users\Joel\AppData\Local\Julia-0.3.9\bin\libjulia.dll (unknown line) > julia_trampoline at > C:\Users\Joel\AppData\Local\Julia-0.3.9\bin\libjulia.dll (unknown line) > unknown function (ip: 4202784) > unknown function (ip: 4199370) > unknown function (ip: 4199672) > BaseThreadInitThunk at C:\WINDOWS\system32\KERNEL32.DLL (unknown line) > RtlUserThreadStart at C:\WINDOWS\SYSTEM32\ntdll.dll (unknown line) > RtlUserThreadStart at C:\WINDOWS\SYSTEM32\ntdll.dll (unknown line) > > I suspect that it's a problem with my code and not Julia, which is why I > haven't submitted a bug report yet. > > I've tried just setting szPname to 0 instead of an array, and I've tried > different index values for unsafe_load, but no luck. Any ideas where I'm > going wrong? The only other issue I can see is that MSDN defines szPname to > be an array of TCHARs, but according to the MSDN, TCHAR is just a char. > https://msdn.microsoft.com/en-us/library/office/cc842072.aspx > > Thanks! > > > >
