From e8b4228833b79034e8328af21f0559ed56f4a0e7 Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Fri, 9 Dec 2016 00:24:12 +0000 Subject: [PATCH] Fix procedure casting; SUBSYSTEM to CONSOLE in linker --- code/demo.odin | 48 ++++++++++++++++++++++++++++++++++------------ core/win32.odin | 2 +- src/checker/expr.c | 4 ++++ src/main.c | 2 +- 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/code/demo.odin b/code/demo.odin index 767eda25916..8c2f7a90d15 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() } diff --git a/core/win32.odin b/core/win32.odin index 56ce416957c..21c77638c32 100644 --- a/core/win32.odin +++ b/core/win32.odin @@ -245,7 +245,7 @@ StretchDIBits :: proc(hdc: HDC, LoadLibraryA :: proc(c_str: ^u8) -> HMODULE #foreign FreeLibrary :: proc(h: HMODULE) #foreign -GetProcAddress :: proc(h: HMODULE, c_str: ^u8) -> proc() #foreign +GetProcAddress :: proc(h: HMODULE, c_str: ^u8) -> rawptr #foreign GetClientRect :: proc(hwnd: HWND, rect: ^RECT) -> BOOL #foreign diff --git a/src/checker/expr.c b/src/checker/expr.c index c0c31452d12..3ed5236fa02 100644 --- a/src/checker/expr.c +++ b/src/checker/expr.c @@ -1880,6 +1880,10 @@ bool check_is_castable_to(Checker *c, Operand *operand, Type *y) { if (is_type_proc(xb) && is_type_rawptr(yb)) { return true; } + // rawptr -> proc + if (is_type_rawptr(xb) && is_type_proc(yb)) { + return true; + } return false; } diff --git a/src/main.c b/src/main.c index a9f3c6d6bef..56452fb879f 100644 --- a/src/main.c +++ b/src/main.c @@ -232,7 +232,7 @@ int main(int argc, char **argv) { exit_code = win32_exec_command_line_app("msvc-link", true, "link %.*s.obj -OUT:%.*s.%s %s " "/defaultlib:libcmt " - "/nologo /incremental:no /opt:ref /subsystem:WINDOWS " + "/nologo /incremental:no /opt:ref /subsystem:CONSOLE " " %.*s " " %s " "",