12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #import "win32.odin"
- #import "fmt.odin"
- #import "sync.odin"
- Dll :: struct {
- Handle :: type rawptr
- name: string
- handle: Handle
- }
- load_library :: proc(name: string) -> (Dll, bool) {
- buf: [4096]byte
- copy(buf[:], name as []byte)
- lib := win32.LoadLibraryA(^buf[0])
- if lib == nil {
- return nil, false
- }
- return Dll{name, lib as Dll.Handle}, true
- }
- free_library :: proc(dll: Dll) {
- win32.FreeLibrary(dll.handle as win32.HMODULE)
- }
- get_proc_address :: proc(dll: Dll, name: string) -> (rawptr, bool) {
- buf: [4096]byte
- copy(buf[:], name as []byte)
- addr := win32.GetProcAddress(dll.handle as win32.HMODULE, ^buf[0]) as rawptr
- if addr == nil {
- return nil, false
- }
- return addr, true
- }
- main :: proc() {
- lib, lib_ok := load_library("example.dll")
- if !lib_ok {
- fmt.println("Could not load library")
- return
- }
- defer free_library(lib)
- proc_addr, addr_ok := get_proc_address(lib, "some_thing")
- if !addr_ok {
- fmt.println("Could not load 'some_thing'")
- return
- }
- some_thing := (proc_addr as proc())
- some_thing()
- }
|