is go-plugin supported by Windows?...We want to create go dll and tey to access through go code
On Thursday, September 29, 2022 at 5:12:34 PM UTC+5:30 Brian Candler wrote: > My first reaction is, do you *really* want to call a Go DLL from a Go main > program? It seems to me like you will have two active copies of the Go > runtime with their own garbage collectors etc. > > Go "plugins" might be closer to what you need: > > https://medium.com/learning-the-go-programming-language/writing-modular-go-programs-with-plugins-ec46381ee1a9 > > But there are a number of caveats: > > https://www.reddit.com/r/golang/comments/b6h8qq/is_anyone_actually_using_go_plugins/ejkxd2k/?utm_source=reddit&utm_medium=web2x&context=3 > > Also consider whether you'd be better off with two separate processes > communicating using gRPC or similar. Hashicorp have published a go-plugin > library which takes this approach: > https://github.com/hashicorp/go-plugin > > On Thursday, 29 September 2022 at 10:34:38 UTC+1 pe...@wonderland.org > wrote: > >> Oh, hang on, please ignore my last message. It's that was because the >> *caller* was defined that way - it's NOT a Go thing. Oops, my bad. >> >> Peter >> >> On Thursday, 29 September 2022 at 10:33:23 UTC+1 Peter Galbavy wrote: >> >>> On Linux at least - I have not tried building or using a Windows DLL, >>> you have to accept C-style args and process them in the exported function >>> signature: >>> >>> e.g. >>> >>> //export SendMail >>> func SendMail(n C.int, args **C.char) C.int { >>> conf := parseArgs(n, args) >>> ... >>> >>> Here my parseArgs() func loops over the args and puts them in a map - >>> which is what I want, but your requirement will be different. >>> >>> Even if you are calling the function from Go code, I believe it still >>> goes through the C ABI. I just followed https://pkg.go.dev/cmd/cgo >>> >>> Peter >>> >>> >>> On Thursday, 29 September 2022 at 09:58:02 UTC+1 squadglad...@gmail.com >>> wrote: >>> >>>> Hi Everyone, >>>> >>>> I'm trying to create go DLL for the below program using "go build >>>> -buildmode=c-shared -o calc.so calc.go" >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> *package mainimport "C"func main() {}//export SayHellofunc >>>> SayHello(name string) {fmt.Printf("Go says: Hello, %s!\n", name)}//export >>>> Addfunc Add(num0, num1 int) int {return num0 + num1}* >>>> >>>> *-----------------------------------------------------------------------------------------------------* >>>> I have written the below logic to access DLL methods, >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> *import "C"import ( "fmt" "syscall" "unsafe")var ( Library >>>> syscall.Handle IsInitialize = false data = "World")func >>>> Loaddll() { if Library == 0 { var error_val error >>>> fmt.Printf("creating handle of c-share Wrapper\n") Library, _ = >>>> syscall.LoadLibrary("calc.dll") if error_val != nil { >>>> fmt.Println(fmt.Sprintf("Error occured while loading dll - %s", >>>> error_val.Error())) } getDetails() }}func getDetails() { >>>> key_uintptr := getUintPtrOfString(data) helloMethod := >>>> getProc("SayHello") get_secret_result, _, _ := >>>> syscall.SyscallN(uintptr(helloMethod), key_uintptr) value := >>>> C.GoString((*C.char)(unsafe.Pointer(get_secret_result))) if >>>> get_secret_result != 0 { fmt.Println(fmt.Sprintf("Get code has given >>>> nonzero result\n %v", value)) }}func getProc(funcname string) (result >>>> uintptr) { result, error_val := syscall.GetProcAddress(Library, >>>> funcname) if error_val != nil { fmt.Println(fmt.Sprintf("Error >>>> while >>>> getting proc %s", error_val.Error())) } return result}func >>>> getUintPtrOfString(s string) uintptr { byte_s := append([]byte(s), 0) >>>> return uintptr(unsafe.Pointer(&byte_s[0]))}* >>>> >>>> *----------------------------------------------------------------------------------------------------* >>>> I'm able to access the DLL method(Add) when we pass int as argument, >>>> but I'm getting errors while passing arguments as a string >>>> (Sayhello)..Here >>>> we are expecting the result as *Go says: Hello,<some string>* >>>> >>> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/9ec20d8c-9d7b-4b62-bf71-861f40546270n%40googlegroups.com.