Still no luck - I've looked at the windows sdk, and I'm sure I've got all the type sizes correct. I've added the stdcall convention to the ccall with no luck, along with initializing szPname to C_NULL, which seems to be the more correct approach from the c source I've looked at. I've tried moving the fields around in the struct, and verified that this is the same error I get if I try to access arbitrary data as a pointer, so I'm starting to wonder if this actually might be a bug. I realized I should also be using bytestring instead of unsafe_load, but again, no change.
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! > > > >
