diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-12-09 00:24:12 +0000 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-12-09 00:24:12 +0000 |
| commit | e8b4228833b79034e8328af21f0559ed56f4a0e7 (patch) | |
| tree | 1651e681ab6fa1d5e8a8db5449300eef3384ae65 /code | |
| parent | 0d69dfcde6baea4fba80d2456986a00c072ad5c9 (diff) | |
Fix procedure casting; SUBSYSTEM to CONSOLE in linker
Diffstat (limited to 'code')
| -rw-r--r-- | code/demo.odin | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/code/demo.odin b/code/demo.odin index 767eda259..8c2f7a90d 100644 --- a/code/demo.odin +++ b/code/demo.odin @@ -1,31 +1,55 @@ #import "win32.odin" #import "fmt.odin" +Dll :: struct { + Handle :: type rawptr + name: string + handle: Handle +} -main :: proc() { - get_proc :: proc(lib: win32.HMODULE, name: string) -> proc() { - buf: [4096]byte - copy(buf[:], name as []byte) +load_library :: proc(name: string) -> (Dll, bool) { + buf: [4096]byte + copy(buf[:], name as []byte) - proc_handle := win32.GetProcAddress(lib, ^buf[0]) - return proc_handle as proc() + lib := win32.LoadLibraryA(^buf[0]) + if lib == nil { + return nil, false } + return Dll{name, lib as Dll.Handle}, true +} - lib := win32.LoadLibraryA(("example.dll\x00" as string).data) - if lib == nil { +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 win32.FreeLibrary(lib) + defer free_library(lib) - proc_handle := get_proc(lib, "some_thing") - if proc_handle == nil { + proc_addr, addr_ok := get_proc_address(lib, "some_thing") + if !addr_ok { fmt.println("Could not load 'some_thing'") return } - some_thing := (proc_handle as proc()) + some_thing := (proc_addr as proc()) fmt.println(some_thing) some_thing() } |