demo.odin 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #import "win32.odin"
  2. #import "fmt.odin"
  3. #import "sync.odin"
  4. Dll :: struct {
  5. Handle :: type rawptr
  6. name: string
  7. handle: Handle
  8. }
  9. load_library :: proc(name: string) -> (Dll, bool) {
  10. buf: [4096]byte
  11. copy(buf[:], name as []byte)
  12. lib := win32.LoadLibraryA(^buf[0])
  13. if lib == nil {
  14. return nil, false
  15. }
  16. return Dll{name, lib as Dll.Handle}, true
  17. }
  18. free_library :: proc(dll: Dll) {
  19. win32.FreeLibrary(dll.handle as win32.HMODULE)
  20. }
  21. get_proc_address :: proc(dll: Dll, name: string) -> (rawptr, bool) {
  22. buf: [4096]byte
  23. copy(buf[:], name as []byte)
  24. addr := win32.GetProcAddress(dll.handle as win32.HMODULE, ^buf[0]) as rawptr
  25. if addr == nil {
  26. return nil, false
  27. }
  28. return addr, true
  29. }
  30. main :: proc() {
  31. lib, lib_ok := load_library("example.dll")
  32. if !lib_ok {
  33. fmt.println("Could not load library")
  34. return
  35. }
  36. defer free_library(lib)
  37. proc_addr, addr_ok := get_proc_address(lib, "some_thing")
  38. if !addr_ok {
  39. fmt.println("Could not load 'some_thing'")
  40. return
  41. }
  42. some_thing := (proc_addr as proc())
  43. some_thing()
  44. }